{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE BlockArguments, LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables, RankNTypes, TypeApplications #-}
{-# LANGUAGE GADTs, TypeFamilies #-}
{-# LANGUAGE DataKinds, PolyKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.Pipeline.Graphics (

	-- * CREATE AND RECREATE

	createGs, unsafeRecreateGs, G, CreateInfo(..),
	CreateInfoListArgsToGArgs, CreateInfoListToMiddle,

	-- ** Group

	group, Group, createGs', unsafeDestroyGs, lookup

	) where

import Prelude hiding (lookup)
import Foreign.Storable.PeekPoke
import Control.Concurrent.STM
import Control.Concurrent.STM.TSem
import Control.Exception
import Data.Kind
import Data.TypeLevel.Maybe qualified as TMaybe
import Data.TypeLevel.ParMaybe qualified as TPMaybe
import Data.TypeLevel.Tuple.Uncurry
import Data.TypeLevel.Tuple.Index qualified as TIndex
import Data.TypeLevel.Tuple.MapIndex qualified as TMapIndex
import Data.Map qualified as Map
import Data.HeteroParList qualified as HeteroParList
import Data.HeteroParList (pattern (:**))
import Data.HeteroParList.Tuple qualified as HeteroParList
import Data.Word
import Data.Int

import Language.SpirV.ShaderKind

import Gpu.Vulkan.Pipeline.Enum
import Gpu.Vulkan.Pipeline.Graphics.Type

import qualified Gpu.Vulkan.AllocationCallbacks as AllocationCallbacks
import qualified Gpu.Vulkan.AllocationCallbacks.Type as AllocationCallbacks
import qualified Gpu.Vulkan.Device.Type as Device
import qualified Gpu.Vulkan.Pipeline.Graphics.Middle as M
import qualified Gpu.Vulkan.PipelineCache.Type as Cache
import qualified Gpu.Vulkan.PipelineLayout.Type as Layout

import qualified Gpu.Vulkan.RenderPass.Type as RenderPass
import qualified Gpu.Vulkan.Pipeline.DynamicState as DynamicState
import qualified Gpu.Vulkan.Pipeline.ColorBlendState as ColorBlendState
import qualified Gpu.Vulkan.Pipeline.DepthStencilState as DepthStencilState
import qualified Gpu.Vulkan.Pipeline.MultisampleState as MultisampleState
import qualified Gpu.Vulkan.Pipeline.RasterizationState as RasterizationState
import qualified Gpu.Vulkan.Pipeline.ViewportState as ViewportState
import qualified Gpu.Vulkan.Pipeline.TessellationState as TessellationState
import qualified Gpu.Vulkan.Pipeline.InputAssemblyState as InputAssemblyState
import Gpu.Vulkan.Pipeline.VertexInputState.Internal
	qualified as VertexInputState
import qualified Gpu.Vulkan.Pipeline.ShaderStage.Internal as ShaderStage

import Gpu.Vulkan.VertexInput qualified as VertexInput

import qualified Gpu.Vulkan.Pipeline.ShaderStage.Middle as ShaderStage.M

-- CREATE AND RECREATE

createGs :: (CreateInfoListToMiddle cias, AllocationCallbacks.ToMiddle mac) =>
	Device.D sd -> Maybe (Cache.P sc) ->
	HeteroParList.PL (U14 CreateInfo) cias ->
	TPMaybe.M (U2 AllocationCallbacks.A) mac ->
	(forall sg .
		HeteroParList.PL
			(U3 (G sg)) (CreateInfoListArgsToGArgs cias) ->
		IO a) -> IO a
createGs :: forall (cias :: [(Maybe (*),
                  [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])],
                  (Maybe (*), [(*, Rate)], [(Nat, *)]), Maybe (*), Maybe (*),
                  Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                  (*, [(*, [BindingType])], [*]), *,
                  (*, [(*, Rate)], [(Nat, *)], (*, [(*, [BindingType])], [*])))])
       (mac :: Maybe (*, *)) sd sc a.
(CreateInfoListToMiddle cias, ToMiddle mac) =>
D sd
-> Maybe (P sc)
-> PL (U14 CreateInfo) cias
-> M (U2 A) mac
-> (forall sg.
    PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias) -> IO a)
-> IO a
createGs d :: D sd
d@(Device.D D
dvc) ((P sc -> P
forall s. P s -> P
Cache.pToMiddle (P sc -> P) -> Maybe (P sc) -> Maybe P
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) -> Maybe P
mc) PL (U14 CreateInfo) cias
cis
	macc :: M (U2 A) mac
macc@(M (U2 A) mac -> M A (Snd mac)
forall (msa :: Maybe (*, *)).
ToMiddle msa =>
M (U2 A) msa -> M A (Snd msa)
AllocationCallbacks.toMiddle -> M A (Snd mac)
macd) forall sg. PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias) -> IO a
f = IO [G] -> ([G] -> IO ()) -> ([G] -> IO a) -> IO a
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket
	(D sd
-> PL (U14 CreateInfo) cias
-> IO (PL (U11 CreateInfo) (MiddleArgs cias))
forall (cias :: [(Maybe (*),
                  [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])],
                  (Maybe (*), [(*, Rate)], [(Nat, *)]), Maybe (*), Maybe (*),
                  Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                  (*, [(*, [BindingType])], [*]), *,
                  (*, [(*, Rate)], [(Nat, *)], (*, [(*, [BindingType])], [*])))])
       sd.
CreateInfoListToMiddle cias =>
D sd
-> PL (U14 CreateInfo) cias
-> IO (PL (U11 CreateInfo) (MiddleArgs cias))
forall sd.
D sd
-> PL (U14 CreateInfo) cias
-> IO (PL (U11 CreateInfo) (MiddleArgs cias))
createInfoListToMiddle D sd
d PL (U14 CreateInfo) cias
cis IO (PL (U11 CreateInfo) (MiddleArgs cias))
-> (PL (U11 CreateInfo) (MiddleArgs cias) -> IO [G]) -> IO [G]
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \PL (U11 CreateInfo) (MiddleArgs cias)
cis' -> D
-> Maybe P
-> PL (U11 CreateInfo) (MiddleArgs cias)
-> M A (Snd mac)
-> IO [G]
forall (cias :: [(Maybe (*), [(Maybe (*), ShaderKind, [*])],
                  Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                  Maybe (*), Maybe (*), Maybe (*))])
       (mc :: Maybe (*)).
CreateInfoListToCore cias =>
D -> Maybe P -> PL (U11 CreateInfo) cias -> M A mc -> IO [G]
M.createGs D
dvc Maybe P
mc PL (U11 CreateInfo) (MiddleArgs cias)
cis'
			(M (U2 A) mac -> M A (Snd mac)
forall (msa :: Maybe (*, *)).
ToMiddle msa =>
M (U2 A) msa -> M A (Snd msa)
AllocationCallbacks.toMiddle M (U2 A) mac
macc)
		IO [G] -> IO () -> IO [G]
forall a b. IO a -> IO b -> IO a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* D sd
-> PL (U11 CreateInfo) (MiddleArgs cias)
-> PL2 (M (U2 A)) (TAllocationCallbacksListList cias)
-> IO ()
forall (mvs :: [(Maybe (*), [(Maybe (*), ShaderKind, [*])],
                 Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                 Maybe (*), Maybe (*), Maybe (*))])
       (macs :: [[Maybe (*, *)]]) sd.
DestroyShaderStages mvs macs =>
D sd -> PL (U11 CreateInfo) mvs -> PL2 (M (U2 A)) macs -> IO ()
forall sd.
D sd
-> PL (U11 CreateInfo) (MiddleArgs cias)
-> PL2 (M (U2 A)) (TAllocationCallbacksListList cias)
-> IO ()
destroyShaderStages' D sd
d PL (U11 CreateInfo) (MiddleArgs cias)
cis' (PL (U14 CreateInfo) cias
-> PL2 (M (U2 A)) (TAllocationCallbacksListList cias)
forall (cias :: [(Maybe (*),
                  [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])],
                  (Maybe (*), [(*, Rate)], [(Nat, *)]), Maybe (*), Maybe (*),
                  Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                  (*, [(*, [BindingType])], [*]), *,
                  (*, [(*, Rate)], [(Nat, *)], (*, [(*, [BindingType])], [*])))]).
AllocationCallbacksListListFromCreateInfoList cias =>
PL (U14 CreateInfo) cias
-> PL2 (M (U2 A)) (TAllocationCallbacksListList cias)
allocationCallbacksListListFromCreateInfoList PL (U14 CreateInfo) cias
cis))
	(\[G]
gs -> D -> [G] -> M A (Snd mac) -> IO ()
forall (md :: Maybe (*)). D -> [G] -> M A md -> IO ()
M.destroyGs D
dvc [G]
gs M A (Snd mac)
macd) (PL (U3 (G Any)) (CreateInfoListArgsToGArgs cias) -> IO a
forall sg. PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias) -> IO a
f (PL (U3 (G Any)) (CreateInfoListArgsToGArgs cias) -> IO a)
-> ([G] -> PL (U3 (G Any)) (CreateInfoListArgsToGArgs cias))
-> [G]
-> IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [G] -> PL (U3 (G Any)) (CreateInfoListArgsToGArgs cias)
forall (ss :: [([(*, Rate)], [(Nat, *)],
                (*, [(*, [BindingType])], [*]))])
       sg.
GListFromMiddle ss =>
[G] -> PL (U3 (G sg)) ss
forall sg. [G] -> PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)
gListFromMiddle)

class GListFromMiddle ss where
	gListFromMiddle :: [M.G] -> HeteroParList.PL (U3 (G sg)) ss
instance GListFromMiddle '[] where
	gListFromMiddle :: forall sg. [G] -> PL (U3 (G sg)) '[]
gListFromMiddle = \case
		[] -> PL (U3 (G sg)) '[]
forall {k} (t :: k -> *). PL t '[]
HeteroParList.Nil
		G
_ : [G]
_ -> [Char] -> PL (U3 (G sg)) '[]
forall a. HasCallStack => [Char] -> a
error [Char]
"Wrong number of elements"

instance GListFromMiddle ss => GListFromMiddle ('(s, t, foo) ': ss) where
	gListFromMiddle :: forall sg. [G] -> PL (U3 (G sg)) ('(s, t, foo) : ss)
gListFromMiddle = \case
		G
g : [G]
gs -> G sg s t foo -> U3 (G sg) '(s, t, foo)
forall {k} {k1} {k2} (t :: k -> k1 -> k2 -> *) (s1 :: k) (s2 :: k1)
       (s3 :: k2).
t s1 s2 s3 -> U3 t '(s1, s2, s3)
U3 (forall s (vibs :: [(*, Rate)]) (vias :: [(Nat, *)])
       (lyta :: (*, [(*, [BindingType])], [*])).
G -> G s vibs vias lyta
G @_ @s @t G
g) U3 (G sg) '(s, t, foo)
-> PL (U3 (G sg)) ss -> PL (U3 (G sg)) ('(s, t, foo) : ss)
forall {k} (t :: k -> *) (s :: k) (ss1 :: [k]).
t s -> PL t ss1 -> PL t (s : ss1)
:** forall (ss :: [([(*, Rate)], [(Nat, *)],
                (*, [(*, [BindingType])], [*]))])
       sg.
GListFromMiddle ss =>
[G] -> PL (U3 (G sg)) ss
gListFromMiddle @ss [G]
gs
		[] -> [Char] -> PL (U3 (G sg)) ('(s, t, foo) : ss)
forall a. HasCallStack => [Char] -> a
error [Char]
"Wrong number of elements"

unsafeRecreateGs :: (CreateInfoListToMiddle cias, AllocationCallbacks.ToMiddle mac) =>
	Device.D sd -> Maybe (Cache.P s) -> HeteroParList.PL (U14 CreateInfo) cias ->
	TPMaybe.M (U2 AllocationCallbacks.A) mac ->
	HeteroParList.PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias) -> IO ()
unsafeRecreateGs :: forall (cias :: [(Maybe (*),
                  [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])],
                  (Maybe (*), [(*, Rate)], [(Nat, *)]), Maybe (*), Maybe (*),
                  Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                  (*, [(*, [BindingType])], [*]), *,
                  (*, [(*, Rate)], [(Nat, *)], (*, [(*, [BindingType])], [*])))])
       (mac :: Maybe (*, *)) sd s sg.
(CreateInfoListToMiddle cias, ToMiddle mac) =>
D sd
-> Maybe (P s)
-> PL (U14 CreateInfo) cias
-> M (U2 A) mac
-> PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)
-> IO ()
unsafeRecreateGs d :: D sd
d@(Device.D D
dvc) ((P s -> P
forall s. P s -> P
Cache.pToMiddle (P s -> P) -> Maybe (P s) -> Maybe P
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) -> Maybe P
mc) PL (U14 CreateInfo) cias
cis M (U2 A) mac
macc PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)
gpls = do
	cis' <- D sd
-> PL (U14 CreateInfo) cias
-> IO (PL (U11 CreateInfo) (MiddleArgs cias))
forall (cias :: [(Maybe (*),
                  [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])],
                  (Maybe (*), [(*, Rate)], [(Nat, *)]), Maybe (*), Maybe (*),
                  Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                  (*, [(*, [BindingType])], [*]), *,
                  (*, [(*, Rate)], [(Nat, *)], (*, [(*, [BindingType])], [*])))])
       sd.
CreateInfoListToMiddle cias =>
D sd
-> PL (U14 CreateInfo) cias
-> IO (PL (U11 CreateInfo) (MiddleArgs cias))
forall sd.
D sd
-> PL (U14 CreateInfo) cias
-> IO (PL (U11 CreateInfo) (MiddleArgs cias))
createInfoListToMiddle D sd
d PL (U14 CreateInfo) cias
cis
	M.recreateGs dvc mc cis'
		(AllocationCallbacks.toMiddle macc) $ gListToMiddle gpls
	destroyShaderStages' d cis' $ allocationCallbacksListListFromCreateInfoList cis

gListToMiddle :: HeteroParList.PL (U3 (G sg)) ss -> [M.G]
gListToMiddle :: forall sg
       (ss :: [([(*, Rate)], [(Nat, *)],
                (*, [(*, [BindingType])], [*]))]).
PL (U3 (G sg)) ss -> [G]
gListToMiddle = (forall (s :: ([(*, Rate)], [(Nat, *)],
               (*, [(*, [BindingType])], [*]))).
 U3 (G sg) s -> G)
-> PL (U3 (G sg)) ss -> [G]
forall k (t :: k -> *) a (ss :: [k]).
(forall (s :: k). t s -> a) -> PL t ss -> [a]
HeteroParList.toList ((forall (s :: ([(*, Rate)], [(Nat, *)],
                (*, [(*, [BindingType])], [*]))).
  U3 (G sg) s -> G)
 -> PL (U3 (G sg)) ss -> [G])
-> (forall (s :: ([(*, Rate)], [(Nat, *)],
                  (*, [(*, [BindingType])], [*]))).
    U3 (G sg) s -> G)
-> PL (U3 (G sg)) ss
-> [G]
forall a b. (a -> b) -> a -> b
$ \(U3 (G G
g)) -> G
g

-- CREATE INFO

data CreateInfo
	mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha =
	CreateInfo {
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> M mn
createInfoNext :: TMaybe.M mn,
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> CreateFlags
createInfoFlags :: CreateFlags,
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> PL (U5 CreateInfo) ssas
createInfoStages ::
			HeteroParList.PL (U5 ShaderStage.CreateInfo) ssas,
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (U3 CreateInfo visa)
createInfoVertexInputState ::
			Maybe (U3 VertexInputState.CreateInfo visa),
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo iasa)
createInfoInputAssemblyState ::
			Maybe (InputAssemblyState.CreateInfo iasa),
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo tsssa)
createInfoTessellationState ::
			Maybe (TessellationState.CreateInfo tsssa),
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo vpsa)
createInfoViewportState :: Maybe (ViewportState.CreateInfo vpsa),
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo rstsa)
createInfoRasterizationState ::
			Maybe (RasterizationState.CreateInfo rstsa),
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo mssa)
createInfoMultisampleState ::
			Maybe (MultisampleState.CreateInfo mssa),
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo dssa)
createInfoDepthStencilState ::
			Maybe (DepthStencilState.CreateInfo dssa),
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo cbsa)
createInfoColorBlendState ::
			Maybe (ColorBlendState.CreateInfo cbsa),
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo dsa)
createInfoDynamicState :: Maybe (DynamicState.CreateInfo dsa),
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> U3 P lyta
createInfoLayout :: U3 Layout.P lyta,
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> R rpa
createInfoRenderPass :: RenderPass.R rpa,
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Word32
createInfoSubpass :: Word32,
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (U4 G bpha)
createInfoBasePipelineHandle :: Maybe (U4 G bpha),
		forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Int32
createInfoBasePipelineIndex :: Int32 }

-- CREATE INFO LIST ARGS TO G ARGS

type family CreateInfoListArgsToGArgs cias where
	CreateInfoListArgsToGArgs '[] = '[]
	CreateInfoListArgsToGArgs (cia ': cias) =
		CreateInfoArgsToGArgs cia ': CreateInfoListArgsToGArgs cias

type family CreateInfoArgsToGArgs cia where
	CreateInfoArgsToGArgs '(
		n, ssas, '(nv, vibs, vias), iasa, tsssa, vpsa, rstsa, mssa, dssa, cbsa, dsa,
		slbtss, rpa, bpha ) = '(vibs, vias, slbtss)

-- CREATE INFO LIST TO MIDDLE

class (	GListFromMiddle (CreateInfoListArgsToGArgs cias),
	DestroyShaderStages
		(MiddleArgs cias) (TAllocationCallbacksListList cias),
	AllocationCallbacksListListFromCreateInfoList cias,
	M.CreateInfoListToCore (MiddleArgs cias) ) =>
	CreateInfoListToMiddle cias where
	type MiddleArgs cias :: [(
		Maybe Type, [(Maybe Type, ShaderKind, [Type])], Maybe Type,
		Maybe Type, Maybe Type, Maybe Type, Maybe Type, Maybe Type,
		Maybe Type, Maybe Type, Maybe Type)]
	createInfoListToMiddle ::
		Device.D sd -> HeteroParList.PL (U14 CreateInfo) cias ->
		IO (HeteroParList.PL (U11 M.CreateInfo) (MiddleArgs cias))

instance CreateInfoListToMiddle '[] where
	type MiddleArgs '[] = '[]
	createInfoListToMiddle :: forall sd.
D sd
-> PL (U14 CreateInfo) '[]
-> IO (PL (U11 CreateInfo) (MiddleArgs '[]))
createInfoListToMiddle D sd
_ PL (U14 CreateInfo) '[]
HeteroParList.Nil = PL (U11 CreateInfo) '[] -> IO (PL (U11 CreateInfo) '[])
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure PL (U11 CreateInfo) '[]
forall {k} (t :: k -> *). PL t '[]
HeteroParList.Nil

instance (

	HeteroParList.Map3_5 ssas,
	ShaderStage.CreateInfoListToMiddle ssas,
	ShaderStage.M.CreateInfoListToCore (ShaderStage.MiddleArgs ssas),
	VertexInputState.BindingStrideList vibs VertexInput.Rate,
	VertexInputState.AttributeDescriptions vibs vias,
	WithPoked (TMaybe.M mn), WithPoked (TMaybe.M nvis),
	WithPoked (TMaybe.M iasa), WithPoked (TMaybe.M tsssa),
	WithPoked (TMaybe.M vpsa), WithPoked (TMaybe.M rstsa),
	WithPoked (TMaybe.M mssa), WithPoked (TMaybe.M dssa),
	WithPoked (TMaybe.M cbsa), WithPoked (TMaybe.M dsa),
	CreateInfoListToMiddle ss ) =>
	CreateInfoListToMiddle ('(
		mn, ssas, '(nvis, vibs, vias), iasa, tsssa, vpsa, rstsa, mssa, dssa, cbsa, dsa,
		'(sl, sbtss, pcl), rpa, '(sb, vibs', vias', slbtss') ) ': ss)  where
	type MiddleArgs ('(
		mn, ssas, '(nvis, vibs, vias), iasa, tsssa, vpsa, rstsa, mssa, dssa, cbsa, dsa,
		'(sl, sbtss, pcl), rpa, '(sb, vibs', vias', slbtss') ) ': ss) =
		'(mn, ShaderStage.MiddleArgs ssas, nvis, iasa, tsssa, vpsa, rstsa,
			mssa, dssa, cbsa, dsa) ': MiddleArgs ss
	createInfoListToMiddle :: forall sd.
D sd
-> PL
     (U14 CreateInfo)
     ('(mn, ssas, '(nvis, vibs, vias), iasa, tsssa, vpsa, rstsa, mssa,
        dssa, cbsa, dsa, '(sl, sbtss, pcl), rpa,
        '(sb, vibs', vias', slbtss'))
        : ss)
-> IO
     (PL
        (U11 CreateInfo)
        (MiddleArgs
           ('(mn, ssas, '(nvis, vibs, vias), iasa, tsssa, vpsa, rstsa, mssa,
              dssa, cbsa, dsa, '(sl, sbtss, pcl), rpa,
              '(sb, vibs', vias', slbtss'))
              : ss)))
createInfoListToMiddle D sd
dvc (U14 CreateInfo s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14
ci :** PL (U14 CreateInfo) ss1
cis) = U11
  CreateInfo
  '(s1, MiddleArgs ssas, nvis, s4, s5, s6, s7, s8, s9, s10, s11)
-> PL (U11 CreateInfo) (MiddleArgs ss)
-> PL
     (U11 CreateInfo)
     ('(s1, MiddleArgs ssas, nvis, s4, s5, s6, s7, s8, s9, s10, s11)
        : MiddleArgs ss)
forall {k} (t :: k -> *) (s :: k) (ss1 :: [k]).
t s -> PL t ss1 -> PL t (s : ss1)
(:**)
		(U11
   CreateInfo
   '(s1, MiddleArgs ssas, nvis, s4, s5, s6, s7, s8, s9, s10, s11)
 -> PL (U11 CreateInfo) (MiddleArgs ss)
 -> PL
      (U11 CreateInfo)
      ('(s1, MiddleArgs ssas, nvis, s4, s5, s6, s7, s8, s9, s10, s11)
         : MiddleArgs ss))
-> IO
     (U11
        CreateInfo
        '(s1, MiddleArgs ssas, nvis, s4, s5, s6, s7, s8, s9, s10, s11))
-> IO
     (PL (U11 CreateInfo) (MiddleArgs ss)
      -> PL
           (U11 CreateInfo)
           ('(s1, MiddleArgs ssas, nvis, s4, s5, s6, s7, s8, s9, s10, s11)
              : MiddleArgs ss))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (CreateInfo s1 (MiddleArgs ssas) nvis s4 s5 s6 s7 s8 s9 s10 s11
-> U11
     CreateInfo
     '(s1, MiddleArgs ssas, nvis, s4, s5, s6, s7, s8, s9, s10, s11)
forall {k} {k1} {k2} {k3} {k4} {k5} {k6} {k7} {k8} {k9} {k10}
       (t :: k
             -> k1 -> k2 -> k3 -> k4 -> k5 -> k6 -> k7 -> k8 -> k9 -> k10 -> *)
       (s1 :: k) (s2 :: k1) (s3 :: k2) (s4 :: k3) (s5 :: k4) (s6 :: k5)
       (s7 :: k6) (s8 :: k7) (s9 :: k8) (s10 :: k9) (s11 :: k10).
t s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11
-> U11 t '(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11)
U11 (CreateInfo s1 (MiddleArgs ssas) nvis s4 s5 s6 s7 s8 s9 s10 s11
 -> U11
      CreateInfo
      '(s1, MiddleArgs ssas, nvis, s4, s5, s6, s7, s8, s9, s10, s11))
-> IO
     (CreateInfo s1 (MiddleArgs ssas) nvis s4 s5 s6 s7 s8 s9 s10 s11)
-> IO
     (U11
        CreateInfo
        '(s1, MiddleArgs ssas, nvis, s4, s5, s6, s7, s8, s9, s10, s11))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> D sd
-> CreateInfo
     s1
     s2
     '(nvis, vibs, vias)
     s4
     s5
     s6
     s7
     s8
     s9
     s10
     s11
     s12
     s13
     '(sb, vibs', vias', slbtss')
-> IO
     (CreateInfo s1 (MiddleArgs s2) nvis s4 s5 s6 s7 s8 s9 s10 s11)
forall (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *),
                  [*])])
       (vibs :: [(*, Rate)]) (vias :: [(Nat, *)]) sd (n :: Maybe (*))
       (nvis :: Maybe (*)) (iasa :: Maybe (*)) (tsssa :: Maybe (*))
       (vpsa :: Maybe (*)) (rstsa :: Maybe (*)) (mssa :: Maybe (*))
       (dssa :: Maybe (*)) (cbsa :: Maybe (*)) (dsa :: Maybe (*))
       (sl :: (*, [(*, [BindingType])], [*])) rpa sb
       (vibs' :: [(*, Rate)]) (vias' :: [(Nat, *)])
       (slbtss' :: (*, [(*, [BindingType])], [*])).
(CreateInfoListToMiddle ssas, BindingStrideList vibs Rate,
 AttributeDescriptions vibs vias) =>
D sd
-> CreateInfo
     n
     ssas
     '(nvis, vibs, vias)
     iasa
     tsssa
     vpsa
     rstsa
     mssa
     dssa
     cbsa
     dsa
     sl
     rpa
     '(sb, vibs', vias', slbtss')
-> IO
     (CreateInfo
        n (MiddleArgs ssas) nvis iasa tsssa vpsa rstsa mssa dssa cbsa dsa)
createInfoToMiddle D sd
dvc CreateInfo s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14
CreateInfo
  s1
  s2
  '(nvis, vibs, vias)
  s4
  s5
  s6
  s7
  s8
  s9
  s10
  s11
  s12
  s13
  '(sb, vibs', vias', slbtss')
ci)
		IO
  (PL (U11 CreateInfo) (MiddleArgs ss)
   -> PL
        (U11 CreateInfo)
        ('(s1, MiddleArgs ssas, nvis, s4, s5, s6, s7, s8, s9, s10, s11)
           : MiddleArgs ss))
-> IO (PL (U11 CreateInfo) (MiddleArgs ss))
-> IO
     (PL
        (U11 CreateInfo)
        ('(s1, MiddleArgs ssas, nvis, s4, s5, s6, s7, s8, s9, s10, s11)
           : MiddleArgs ss))
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> D sd
-> PL (U14 CreateInfo) ss1
-> IO (PL (U11 CreateInfo) (MiddleArgs ss1))
forall (cias :: [(Maybe (*),
                  [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])],
                  (Maybe (*), [(*, Rate)], [(Nat, *)]), Maybe (*), Maybe (*),
                  Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                  (*, [(*, [BindingType])], [*]), *,
                  (*, [(*, Rate)], [(Nat, *)], (*, [(*, [BindingType])], [*])))])
       sd.
CreateInfoListToMiddle cias =>
D sd
-> PL (U14 CreateInfo) cias
-> IO (PL (U11 CreateInfo) (MiddleArgs cias))
forall sd.
D sd
-> PL (U14 CreateInfo) ss1
-> IO (PL (U11 CreateInfo) (MiddleArgs ss1))
createInfoListToMiddle D sd
dvc PL (U14 CreateInfo) ss1
cis

createInfoToMiddle :: (
	ShaderStage.CreateInfoListToMiddle ssas,
	VertexInputState.BindingStrideList vibs VertexInput.Rate,
	VertexInputState.AttributeDescriptions vibs vias ) =>
	Device.D sd ->
	CreateInfo n ssas '(nvis, vibs, vias)
		iasa tsssa vpsa rstsa mssa dssa cbsa dsa sl rpa '(sb, vibs', vias', slbtss') ->
	IO (M.CreateInfo n (ShaderStage.MiddleArgs ssas)
		nvis iasa tsssa vpsa rstsa mssa dssa cbsa dsa)
createInfoToMiddle :: forall (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *),
                  [*])])
       (vibs :: [(*, Rate)]) (vias :: [(Nat, *)]) sd (n :: Maybe (*))
       (nvis :: Maybe (*)) (iasa :: Maybe (*)) (tsssa :: Maybe (*))
       (vpsa :: Maybe (*)) (rstsa :: Maybe (*)) (mssa :: Maybe (*))
       (dssa :: Maybe (*)) (cbsa :: Maybe (*)) (dsa :: Maybe (*))
       (sl :: (*, [(*, [BindingType])], [*])) rpa sb
       (vibs' :: [(*, Rate)]) (vias' :: [(Nat, *)])
       (slbtss' :: (*, [(*, [BindingType])], [*])).
(CreateInfoListToMiddle ssas, BindingStrideList vibs Rate,
 AttributeDescriptions vibs vias) =>
D sd
-> CreateInfo
     n
     ssas
     '(nvis, vibs, vias)
     iasa
     tsssa
     vpsa
     rstsa
     mssa
     dssa
     cbsa
     dsa
     sl
     rpa
     '(sb, vibs', vias', slbtss')
-> IO
     (CreateInfo
        n (MiddleArgs ssas) nvis iasa tsssa vpsa rstsa mssa dssa cbsa dsa)
createInfoToMiddle D sd
dvc CreateInfo {
	createInfoNext :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> M mn
createInfoNext = M n
mnxt,
	createInfoFlags :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> CreateFlags
createInfoFlags = CreateFlags
flgs,
	createInfoStages :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> PL (U5 CreateInfo) ssas
createInfoStages = PL (U5 CreateInfo) ssas
stgs,
	createInfoVertexInputState :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (U3 CreateInfo visa)
createInfoVertexInputState = Maybe (U3 CreateInfo '(nvis, vibs, vias))
vis,
	createInfoInputAssemblyState :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo iasa)
createInfoInputAssemblyState = Maybe (CreateInfo iasa)
ias,
	createInfoTessellationState :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo tsssa)
createInfoTessellationState = Maybe (CreateInfo tsssa)
ts,
	createInfoViewportState :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo vpsa)
createInfoViewportState = Maybe (CreateInfo vpsa)
vs,
	createInfoRasterizationState :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo rstsa)
createInfoRasterizationState = Maybe (CreateInfo rstsa)
rs,
	createInfoMultisampleState :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo mssa)
createInfoMultisampleState = Maybe (CreateInfo mssa)
ms,
	createInfoDepthStencilState :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo dssa)
createInfoDepthStencilState = Maybe (CreateInfo dssa)
dss,
	createInfoColorBlendState :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo cbsa)
createInfoColorBlendState = Maybe (CreateInfo cbsa)
cbs,
	createInfoDynamicState :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (CreateInfo dsa)
createInfoDynamicState = Maybe (CreateInfo dsa)
ds,
	createInfoLayout :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> U3 P lyta
createInfoLayout = U3 (Layout.P P
lyt),
	createInfoRenderPass :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> R rpa
createInfoRenderPass = RenderPass.R R
rp,
	createInfoSubpass :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Word32
createInfoSubpass = Word32
sp,
	createInfoBasePipelineHandle :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Maybe (U4 G bpha)
createInfoBasePipelineHandle = Maybe (U4 G '(sb, vibs', vias', slbtss'))
bph,
	createInfoBasePipelineIndex :: forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> Int32
createInfoBasePipelineIndex = Int32
bpi } = do
	stgs' <- D sd
-> PL (U5 CreateInfo) ssas
-> IO (PL (U3 CreateInfo) (MiddleArgs ssas))
forall (cias :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *),
                  [*])])
       ds.
CreateInfoListToMiddle cias =>
D ds
-> PL (U5 CreateInfo) cias
-> IO (PL (U3 CreateInfo) (MiddleArgs cias))
forall ds.
D ds
-> PL (U5 CreateInfo) ssas
-> IO (PL (U3 CreateInfo) (MiddleArgs ssas))
ShaderStage.createInfoListToMiddle D sd
dvc PL (U5 CreateInfo) ssas
stgs
	bph' <- maybe M.gNull (\(U4 (G G
g)) -> G -> IO G
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure G
g) bph
	pure M.CreateInfo {
		M.createInfoNext = mnxt,
		M.createInfoFlags = flgs,
		M.createInfoStages = stgs',
		M.createInfoVertexInputState =
			VertexInputState.createInfoToMiddle . unU3 <$> vis,
		M.createInfoInputAssemblyState = ias,
		M.createInfoTessellationState = ts,
		M.createInfoViewportState = vs,
		M.createInfoRasterizationState = rs,
		M.createInfoMultisampleState = ms,
		M.createInfoDepthStencilState = dss,
		M.createInfoColorBlendState = cbs,
		M.createInfoDynamicState = ds,
		M.createInfoLayout = lyt,
		M.createInfoRenderPass = rp,
		M.createInfoSubpass = sp,
		M.createInfoBasePipelineHandle = bph',
		M.createInfoBasePipelineIndex = bpi }

-- DESTROY SHADER STAGES

class DestroyShaderStages mvs macs where
	destroyShaderStages' :: Device.D sd ->
		HeteroParList.PL (U11 M.CreateInfo) mvs ->
		HeteroParList.PL2
			(TPMaybe.M (U2 AllocationCallbacks.A)) macs -> IO ()

instance DestroyShaderStages '[] '[] where
	destroyShaderStages' :: forall sd.
D sd -> PL (U11 CreateInfo) '[] -> PL2 (M (U2 A)) '[] -> IO ()
destroyShaderStages' D sd
_ PL (U11 CreateInfo) '[]
HeteroParList.Nil PL2 (M (U2 A)) '[]
HeteroParList.Nil = () -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

instance (ShaderStage.DestroyShaderModuleList a2 mac, DestroyShaderStages ss macs) =>
	DestroyShaderStages ('(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) ': ss) (mac ': macs) where
	destroyShaderStages' :: forall sd.
D sd
-> PL
     (U11 CreateInfo)
     ('(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) : ss)
-> PL2 (M (U2 A)) (mac : macs)
-> IO ()
destroyShaderStages' D sd
dvc (U11 CreateInfo s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11
cim :** PL (U11 CreateInfo) ss1
cims) (PL (M (U2 A)) s
mac :** PL (PL (M (U2 A))) ss1
macs) = do
		D sd -> PL (U3 CreateInfo) s2 -> PL (M (U2 A)) s -> IO ()
forall (cias :: [(Maybe (*), ShaderKind, [*])])
       (macs :: [Maybe (*, *)]) sd.
DestroyShaderModuleList cias macs =>
D sd -> PL (U3 CreateInfo) cias -> PL (M (U2 A)) macs -> IO ()
forall sd.
D sd -> PL (U3 CreateInfo) s2 -> PL (M (U2 A)) s -> IO ()
ShaderStage.destroyShaderModuleList D sd
dvc (CreateInfo s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11
-> PL (U3 CreateInfo) s2
forall (mn :: Maybe (*)) (stg :: [(Maybe (*), ShaderKind, [*])])
       (vis :: Maybe (*)) (ias :: Maybe (*)) (ts :: Maybe (*))
       (vs :: Maybe (*)) (rs :: Maybe (*)) (ms :: Maybe (*))
       (dss :: Maybe (*)) (cbs :: Maybe (*)) (ds :: Maybe (*)).
CreateInfo mn stg vis ias ts vs rs ms dss cbs ds
-> PL (U3 CreateInfo) stg
M.createInfoStages CreateInfo s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11
cim) PL (M (U2 A)) s
mac
		D sd -> PL (U11 CreateInfo) ss1 -> PL (PL (M (U2 A))) ss1 -> IO ()
forall (mvs :: [(Maybe (*), [(Maybe (*), ShaderKind, [*])],
                 Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                 Maybe (*), Maybe (*), Maybe (*))])
       (macs :: [[Maybe (*, *)]]) sd.
DestroyShaderStages mvs macs =>
D sd -> PL (U11 CreateInfo) mvs -> PL2 (M (U2 A)) macs -> IO ()
forall sd.
D sd -> PL (U11 CreateInfo) ss1 -> PL (PL (M (U2 A))) ss1 -> IO ()
destroyShaderStages' D sd
dvc PL (U11 CreateInfo) ss1
cims PL (PL (M (U2 A))) ss1
macs

class AllocationCallbacksListListFromCreateInfoList cias where
	type TAllocationCallbacksListList cias :: [[Maybe (Type, Type)]]
	allocationCallbacksListListFromCreateInfoList ::
		HeteroParList.PL (U14 CreateInfo) cias ->
		HeteroParList.PL2
			(TPMaybe.M (U2 AllocationCallbacks.A))
			(TAllocationCallbacksListList cias)

instance AllocationCallbacksListListFromCreateInfoList '[] where
	type TAllocationCallbacksListList '[] = '[]
	allocationCallbacksListListFromCreateInfoList :: PL (U14 CreateInfo) '[]
-> PL2 (M (U2 A)) (TAllocationCallbacksListList '[])
allocationCallbacksListListFromCreateInfoList
		PL (U14 CreateInfo) '[]
HeteroParList.Nil = PL2 (M (U2 A)) '[]
PL2 (M (U2 A)) (TAllocationCallbacksListList '[])
forall {k} (t :: k -> *). PL t '[]
HeteroParList.Nil

instance (
	HeteroParList.Map3_5 (TIndex.I1_14 cia),
	AllocationCallbacksListListFromCreateInfoList cias ) =>
	AllocationCallbacksListListFromCreateInfoList (cia ': cias) where
	type TAllocationCallbacksListList (cia ': cias) =
		TMapIndex.M3_5 (TIndex.I1_14 cia) ':
		TAllocationCallbacksListList cias
	allocationCallbacksListListFromCreateInfoList :: PL (U14 CreateInfo) (cia : cias)
-> PL2 (M (U2 A)) (TAllocationCallbacksListList (cia : cias))
allocationCallbacksListListFromCreateInfoList (U14 CreateInfo s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14
ci :** PL (U14 CreateInfo) ss1
cis) =
		CreateInfo s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14
-> PL (M (U2 A)) (M3_5 s2)
forall (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *),
                  [*])])
       (mn :: Maybe (*)) (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)]))
       (iasa :: Maybe (*)) (tsssa :: Maybe (*)) (vpsa :: Maybe (*))
       (rstsa :: Maybe (*)) (mssa :: Maybe (*)) (dssa :: Maybe (*))
       (cbsa :: Maybe (*)) (dsa :: Maybe (*))
       (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
Map3_5 ssas =>
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> PL (M (U2 A)) (M3_5 ssas)
allocationCallbacksListFromCreateInfo CreateInfo s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14
ci PL (M (U2 A)) (M3_5 s2)
-> PL (PL (M (U2 A))) (TAllocationCallbacksListList cias)
-> PL (PL (M (U2 A))) (M3_5 s2 : TAllocationCallbacksListList cias)
forall {k} (t :: k -> *) (s :: k) (ss1 :: [k]).
t s -> PL t ss1 -> PL t (s : ss1)
:**
		PL (U14 CreateInfo) ss1
-> PL2 (M (U2 A)) (TAllocationCallbacksListList ss1)
forall (cias :: [(Maybe (*),
                  [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])],
                  (Maybe (*), [(*, Rate)], [(Nat, *)]), Maybe (*), Maybe (*),
                  Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                  (*, [(*, [BindingType])], [*]), *,
                  (*, [(*, Rate)], [(Nat, *)], (*, [(*, [BindingType])], [*])))]).
AllocationCallbacksListListFromCreateInfoList cias =>
PL (U14 CreateInfo) cias
-> PL2 (M (U2 A)) (TAllocationCallbacksListList cias)
allocationCallbacksListListFromCreateInfoList PL (U14 CreateInfo) ss1
cis

allocationCallbacksListFromCreateInfo :: HeteroParList.Map3_5 ssas =>
	CreateInfo mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha ->
	HeteroParList.PL (TPMaybe.M (U2 AllocationCallbacks.A)) (TMapIndex.M3_5 ssas)
allocationCallbacksListFromCreateInfo :: forall (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *),
                  [*])])
       (mn :: Maybe (*)) (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)]))
       (iasa :: Maybe (*)) (tsssa :: Maybe (*)) (vpsa :: Maybe (*))
       (rstsa :: Maybe (*)) (mssa :: Maybe (*)) (dssa :: Maybe (*))
       (cbsa :: Maybe (*)) (dsa :: Maybe (*))
       (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
Map3_5 ssas =>
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> PL (M (U2 A)) (M3_5 ssas)
allocationCallbacksListFromCreateInfo =
	PL (U5 CreateInfo) ssas -> PL (M (U2 A)) (M3_5 ssas)
forall (cias :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *),
                  [*])]).
Map3_5 cias =>
PL (U5 CreateInfo) cias -> PL (M (U2 A)) (M3_5 cias)
ShaderStage.allocationCallbacksListFromCreateInfoList (PL (U5 CreateInfo) ssas -> PL (M (U2 A)) (M3_5 ssas))
-> (CreateInfo
      mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
    -> PL (U5 CreateInfo) ssas)
-> CreateInfo
     mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> PL (M (U2 A)) (M3_5 ssas)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> PL (U5 CreateInfo) ssas
forall (mn :: Maybe (*))
       (ssas :: [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])])
       (visa :: (Maybe (*), [(*, Rate)], [(Nat, *)])) (iasa :: Maybe (*))
       (tsssa :: Maybe (*)) (vpsa :: Maybe (*)) (rstsa :: Maybe (*))
       (mssa :: Maybe (*)) (dssa :: Maybe (*)) (cbsa :: Maybe (*))
       (dsa :: Maybe (*)) (lyta :: (*, [(*, [BindingType])], [*])) rpa
       (bpha :: (*, [(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))).
CreateInfo
  mn ssas visa iasa tsssa vpsa rstsa mssa dssa cbsa dsa lyta rpa bpha
-> PL (U5 CreateInfo) ssas
createInfoStages

-- Group

data Group sd ma sg k gas = Group (Device.D sd)
	(TPMaybe.M (U2 AllocationCallbacks.A) ma)
	TSem (TVar (Map.Map k ( HeteroParList.PL (U3 (G sg)) gas)))

group :: AllocationCallbacks.ToMiddle ma =>
	Device.D sd -> TPMaybe.M (U2 AllocationCallbacks.A) ma ->
	(forall sg . Group sd ma sg k gas -> IO a) -> IO a
group :: forall (ma :: Maybe (*, *)) sd k
       (gas :: [([(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))])
       a.
ToMiddle ma =>
D sd
-> M (U2 A) ma -> (forall sg. Group sd ma sg k gas -> IO a) -> IO a
group dvc :: D sd
dvc@(Device.D D
mdvc) mac :: M (U2 A) ma
mac@(M (U2 A) ma -> M A (Snd ma)
forall (msa :: Maybe (*, *)).
ToMiddle msa =>
M (U2 A) msa -> M A (Snd msa)
AllocationCallbacks.toMiddle -> M A (Snd ma)
mmac) forall sg. Group sd ma sg k gas -> IO a
f = do
	(sem, m) <- STM (TSem, TVar (Map k (PL (U3 (G Any)) gas)))
-> IO (TSem, TVar (Map k (PL (U3 (G Any)) gas)))
forall a. STM a -> IO a
atomically (STM (TSem, TVar (Map k (PL (U3 (G Any)) gas)))
 -> IO (TSem, TVar (Map k (PL (U3 (G Any)) gas))))
-> STM (TSem, TVar (Map k (PL (U3 (G Any)) gas)))
-> IO (TSem, TVar (Map k (PL (U3 (G Any)) gas)))
forall a b. (a -> b) -> a -> b
$ (,) (TSem
 -> TVar (Map k (PL (U3 (G Any)) gas))
 -> (TSem, TVar (Map k (PL (U3 (G Any)) gas))))
-> STM TSem
-> STM
     (TVar (Map k (PL (U3 (G Any)) gas))
      -> (TSem, TVar (Map k (PL (U3 (G Any)) gas))))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> STM TSem
newTSem Integer
1 STM
  (TVar (Map k (PL (U3 (G Any)) gas))
   -> (TSem, TVar (Map k (PL (U3 (G Any)) gas))))
-> STM (TVar (Map k (PL (U3 (G Any)) gas)))
-> STM (TSem, TVar (Map k (PL (U3 (G Any)) gas)))
forall a b. STM (a -> b) -> STM a -> STM b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Map k (PL (U3 (G Any)) gas)
-> STM (TVar (Map k (PL (U3 (G Any)) gas)))
forall a. a -> STM (TVar a)
newTVar Map k (PL (U3 (G Any)) gas)
forall k a. Map k a
Map.empty
	rtn <- f $ Group dvc mac sem m
	((\PL (U3 (G Any)) gas
gs -> D -> [G] -> M A (Snd ma) -> IO ()
forall (md :: Maybe (*)). D -> [G] -> M A md -> IO ()
M.destroyGs D
mdvc (PL (U3 (G Any)) gas -> [G]
forall sg
       (ss :: [([(*, Rate)], [(Nat, *)],
                (*, [(*, [BindingType])], [*]))]).
PL (U3 (G sg)) ss -> [G]
gListToMiddle PL (U3 (G Any)) gas
gs) M A (Snd ma)
mmac) `mapM_`)
		=<< atomically (readTVar m)
	pure rtn

createGs' :: (
	Ord k,
	CreateInfoListToMiddle cias, AllocationCallbacks.ToMiddle mac ) =>
	Group sd mac sg k (CreateInfoListArgsToGArgs cias) -> k ->
	Maybe (Cache.P sc) ->
	HeteroParList.PL (U14 CreateInfo) cias ->
	IO (Either String
		(HeteroParList.PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)))
createGs' :: forall k
       (cias :: [(Maybe (*),
                  [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])],
                  (Maybe (*), [(*, Rate)], [(Nat, *)]), Maybe (*), Maybe (*),
                  Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                  (*, [(*, [BindingType])], [*]), *,
                  (*, [(*, Rate)], [(Nat, *)], (*, [(*, [BindingType])], [*])))])
       (mac :: Maybe (*, *)) sd sg sc.
(Ord k, CreateInfoListToMiddle cias, ToMiddle mac) =>
Group sd mac sg k (CreateInfoListArgsToGArgs cias)
-> k
-> Maybe (P sc)
-> PL (U14 CreateInfo) cias
-> IO
     (Either [Char] (PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)))
createGs' (Group d :: D sd
d@(Device.D D
dvc)
	(M (U2 A) mac -> M A (Snd mac)
forall (msa :: Maybe (*, *)).
ToMiddle msa =>
M (U2 A) msa -> M A (Snd msa)
AllocationCallbacks.toMiddle -> M A (Snd mac)
mmac) TSem
sem TVar (Map k (PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)))
gss) k
k
	((P sc -> P
forall s. P s -> P
Cache.pToMiddle (P sc -> P) -> Maybe (P sc) -> Maybe P
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) -> Maybe P
mc) PL (U14 CreateInfo) cias
cis = do
	ok <- STM Bool -> IO Bool
forall a. STM a -> IO a
atomically do
		mx <- k
-> Map k (PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias))
-> Maybe (PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias))
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup k
k (Map k (PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias))
 -> Maybe (PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)))
-> STM (Map k (PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)))
-> STM (Maybe (PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TVar (Map k (PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)))
-> STM (Map k (PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)))
forall a. TVar a -> STM a
readTVar TVar (Map k (PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)))
gss
		case mx of
			Maybe (PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias))
Nothing -> TSem -> STM ()
waitTSem TSem
sem STM () -> STM Bool -> STM Bool
forall a b. STM a -> STM b -> STM b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Bool -> STM Bool
forall a. a -> STM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
			Just PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)
_ -> Bool -> STM Bool
forall a. a -> STM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
	if ok
	then do	gs <- createInfoListToMiddle d cis >>= \PL (U11 CreateInfo) (MiddleArgs cias)
cis' -> D
-> Maybe P
-> PL (U11 CreateInfo) (MiddleArgs cias)
-> M A (Snd mac)
-> IO [G]
forall (cias :: [(Maybe (*), [(Maybe (*), ShaderKind, [*])],
                  Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                  Maybe (*), Maybe (*), Maybe (*))])
       (mc :: Maybe (*)).
CreateInfoListToCore cias =>
D -> Maybe P -> PL (U11 CreateInfo) cias -> M A mc -> IO [G]
M.createGs D
dvc Maybe P
mc PL (U11 CreateInfo) (MiddleArgs cias)
cis' M A (Snd mac)
mmac
				IO [G] -> IO () -> IO [G]
forall a b. IO a -> IO b -> IO a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* D sd
-> PL (U11 CreateInfo) (MiddleArgs cias)
-> PL2 (M (U2 A)) (TAllocationCallbacksListList cias)
-> IO ()
forall (mvs :: [(Maybe (*), [(Maybe (*), ShaderKind, [*])],
                 Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                 Maybe (*), Maybe (*), Maybe (*))])
       (macs :: [[Maybe (*, *)]]) sd.
DestroyShaderStages mvs macs =>
D sd -> PL (U11 CreateInfo) mvs -> PL2 (M (U2 A)) macs -> IO ()
forall sd.
D sd
-> PL (U11 CreateInfo) (MiddleArgs cias)
-> PL2 (M (U2 A)) (TAllocationCallbacksListList cias)
-> IO ()
destroyShaderStages' D sd
d PL (U11 CreateInfo) (MiddleArgs cias)
cis'
					(PL (U14 CreateInfo) cias
-> PL2 (M (U2 A)) (TAllocationCallbacksListList cias)
forall (cias :: [(Maybe (*),
                  [(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*])],
                  (Maybe (*), [(*, Rate)], [(Nat, *)]), Maybe (*), Maybe (*),
                  Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*), Maybe (*),
                  (*, [(*, [BindingType])], [*]), *,
                  (*, [(*, Rate)], [(Nat, *)], (*, [(*, [BindingType])], [*])))]).
AllocationCallbacksListListFromCreateInfoList cias =>
PL (U14 CreateInfo) cias
-> PL2 (M (U2 A)) (TAllocationCallbacksListList cias)
allocationCallbacksListListFromCreateInfoList PL (U14 CreateInfo) cias
cis)
		let	gs' = [G] -> PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)
forall (ss :: [([(*, Rate)], [(Nat, *)],
                (*, [(*, [BindingType])], [*]))])
       sg.
GListFromMiddle ss =>
[G] -> PL (U3 (G sg)) ss
forall sg. [G] -> PL (U3 (G sg)) (CreateInfoListArgsToGArgs cias)
gListFromMiddle [G]
gs
		atomically $ modifyTVar gss (Map.insert k gs') >> signalTSem sem
		pure $ Right gs'
	else pure . Left $
		"Gpu.Vulkan.Pipeline.Graphics.create' :: The key already exist"

unsafeDestroyGs :: (Ord k, AllocationCallbacks.ToMiddle ma) =>
	Group sd ma sg k gas -> k -> IO (Either String ())
unsafeDestroyGs :: forall k (ma :: Maybe (*, *)) sd sg
       (gas :: [([(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))]).
(Ord k, ToMiddle ma) =>
Group sd ma sg k gas -> k -> IO (Either [Char] ())
unsafeDestroyGs (Group (Device.D D
mdvc)
	(M (U2 A) ma -> M A (Snd ma)
forall (msa :: Maybe (*, *)).
ToMiddle msa =>
M (U2 A) msa -> M A (Snd msa)
AllocationCallbacks.toMiddle -> M A (Snd ma)
mma) TSem
sem TVar (Map k (PL (U3 (G sg)) gas))
gss) k
k = do
	mgs <- STM (Maybe (PL (U3 (G sg)) gas)) -> IO (Maybe (PL (U3 (G sg)) gas))
forall a. STM a -> IO a
atomically do
		mx <- k -> Map k (PL (U3 (G sg)) gas) -> Maybe (PL (U3 (G sg)) gas)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup k
k (Map k (PL (U3 (G sg)) gas) -> Maybe (PL (U3 (G sg)) gas))
-> STM (Map k (PL (U3 (G sg)) gas))
-> STM (Maybe (PL (U3 (G sg)) gas))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TVar (Map k (PL (U3 (G sg)) gas))
-> STM (Map k (PL (U3 (G sg)) gas))
forall a. TVar a -> STM a
readTVar TVar (Map k (PL (U3 (G sg)) gas))
gss
		case mx of
			Maybe (PL (U3 (G sg)) gas)
Nothing -> Maybe (PL (U3 (G sg)) gas) -> STM (Maybe (PL (U3 (G sg)) gas))
forall a. a -> STM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (PL (U3 (G sg)) gas)
forall a. Maybe a
Nothing
			Just PL (U3 (G sg)) gas
_ -> TSem -> STM ()
waitTSem TSem
sem STM ()
-> STM (Maybe (PL (U3 (G sg)) gas))
-> STM (Maybe (PL (U3 (G sg)) gas))
forall a b. STM a -> STM b -> STM b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Maybe (PL (U3 (G sg)) gas) -> STM (Maybe (PL (U3 (G sg)) gas))
forall a. a -> STM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (PL (U3 (G sg)) gas)
mx
	case mgs of
		Maybe (PL (U3 (G sg)) gas)
Nothing -> Either [Char] () -> IO (Either [Char] ())
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either [Char] () -> IO (Either [Char] ()))
-> Either [Char] () -> IO (Either [Char] ())
forall a b. (a -> b) -> a -> b
$ [Char] -> Either [Char] ()
forall a b. a -> Either a b
Left
			[Char]
"Gpu.Vulkan.Pipeline.Graphics.unsafeDestroyGs: No such key"
		Just PL (U3 (G sg)) gas
gs -> do
			STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ())
-> ((Map k (PL (U3 (G sg)) gas) -> Map k (PL (U3 (G sg)) gas))
    -> STM ())
-> (Map k (PL (U3 (G sg)) gas) -> Map k (PL (U3 (G sg)) gas))
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TVar (Map k (PL (U3 (G sg)) gas))
-> (Map k (PL (U3 (G sg)) gas) -> Map k (PL (U3 (G sg)) gas))
-> STM ()
forall a. TVar a -> (a -> a) -> STM ()
modifyTVar TVar (Map k (PL (U3 (G sg)) gas))
gss ((Map k (PL (U3 (G sg)) gas) -> Map k (PL (U3 (G sg)) gas))
 -> IO ())
-> (Map k (PL (U3 (G sg)) gas) -> Map k (PL (U3 (G sg)) gas))
-> IO ()
forall a b. (a -> b) -> a -> b
$ k -> Map k (PL (U3 (G sg)) gas) -> Map k (PL (U3 (G sg)) gas)
forall k a. Ord k => k -> Map k a -> Map k a
Map.delete k
k
			D -> [G] -> M A (Snd ma) -> IO ()
forall (md :: Maybe (*)). D -> [G] -> M A md -> IO ()
M.destroyGs D
mdvc (PL (U3 (G sg)) gas -> [G]
forall sg
       (ss :: [([(*, Rate)], [(Nat, *)],
                (*, [(*, [BindingType])], [*]))]).
PL (U3 (G sg)) ss -> [G]
gListToMiddle PL (U3 (G sg)) gas
gs) M A (Snd ma)
mma
			() -> Either [Char] ()
forall a b. b -> Either a b
Right (() -> Either [Char] ()) -> IO () -> IO (Either [Char] ())
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> STM () -> IO ()
forall a. STM a -> IO a
atomically (TSem -> STM ()
signalTSem TSem
sem)

lookup :: Ord k =>
	Group sd ma sg k gas -> k -> IO (Maybe (HeteroParList.PL (U3 (G sg)) gas))
lookup :: forall k sd (ma :: Maybe (*, *)) sg
       (gas :: [([(*, Rate)], [(Nat, *)],
                 (*, [(*, [BindingType])], [*]))]).
Ord k =>
Group sd ma sg k gas -> k -> IO (Maybe (PL (U3 (G sg)) gas))
lookup (Group D sd
_ M (U2 A) ma
_ TSem
_sem TVar (Map k (PL (U3 (G sg)) gas))
gss) k
k = STM (Maybe (PL (U3 (G sg)) gas)) -> IO (Maybe (PL (U3 (G sg)) gas))
forall a. STM a -> IO a
atomically (STM (Maybe (PL (U3 (G sg)) gas))
 -> IO (Maybe (PL (U3 (G sg)) gas)))
-> STM (Maybe (PL (U3 (G sg)) gas))
-> IO (Maybe (PL (U3 (G sg)) gas))
forall a b. (a -> b) -> a -> b
$ k -> Map k (PL (U3 (G sg)) gas) -> Maybe (PL (U3 (G sg)) gas)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup k
k (Map k (PL (U3 (G sg)) gas) -> Maybe (PL (U3 (G sg)) gas))
-> STM (Map k (PL (U3 (G sg)) gas))
-> STM (Maybe (PL (U3 (G sg)) gas))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TVar (Map k (PL (U3 (G sg)) gas))
-> STM (Map k (PL (U3 (G sg)) gas))
forall a. TVar a -> STM a
readTVar TVar (Map k (PL (U3 (G sg)) gas))
gss