{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE TypeApplications, RankNTypes #-}
{-# LANGUAGE MonoLocalBinds, GADTs, TypeFamilies #-}
{-# LANGUAGE DataKinds, PolyKinds #-}
{-# LANGUAGE KindSignatures, TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts, FlexibleInstances #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
module Gpu.Vulkan.Pipeline.Compute (
createCs, C(..), CreateInfo(..),
CreateInfoListToMiddle, FromMiddleList
) where
import Foreign.Storable.PeekPoke
import Foreign.Storable.HeteroList
import Control.Exception
import Data.TypeLevel.Maybe qualified as TMaybe
import Data.TypeLevel.ParMaybe qualified as TPMaybe
import Data.TypeLevel.Tuple.Uncurry
import Data.TypeLevel.Tuple.MapIndex qualified as TMapIndex
import qualified Data.HeteroParList as HeteroParList
import Data.HeteroParList (pattern (:**))
import Data.Kind
import Data.Int
import Language.SpirV.ShaderKind
import Gpu.Vulkan.Pipeline.Enum
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.ShaderStage.Internal as ShaderStage
import qualified Gpu.Vulkan.DescriptorSetLayout.Type as DescriptorSetLayout
import qualified Gpu.Vulkan.PipelineLayout.Type as Layout
import qualified Gpu.Vulkan.PipelineCache.Type as Cache
import qualified Gpu.Vulkan.Pipeline.Compute.Middle as M
newtype C s (lyta ::
(Type, [(Type, [DescriptorSetLayout.BindingType])], [Type])) = C M.C
deriving Int -> C s lyta -> ShowS
[C s lyta] -> ShowS
C s lyta -> String
(Int -> C s lyta -> ShowS)
-> (C s lyta -> String) -> ([C s lyta] -> ShowS) -> Show (C s lyta)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
Int -> C s lyta -> ShowS
forall k (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
[C s lyta] -> ShowS
forall k (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
C s lyta -> String
$cshowsPrec :: forall k (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
Int -> C s lyta -> ShowS
showsPrec :: Int -> C s lyta -> ShowS
$cshow :: forall k (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
C s lyta -> String
show :: C s lyta -> String
$cshowList :: forall k (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
[C s lyta] -> ShowS
showList :: [C s lyta] -> ShowS
Show
data CreateInfo mn ssta lyta bpha = CreateInfo {
forall {k} (mn :: Maybe (*))
(ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> M mn
createInfoNext :: TMaybe.M mn,
forall {k} (mn :: Maybe (*))
(ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> CreateFlags
createInfoFlags :: CreateFlags,
forall {k} (mn :: Maybe (*))
(ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> U5 CreateInfo ssta
createInfoStage :: U5 ShaderStage.CreateInfo ssta,
forall {k} (mn :: Maybe (*))
(ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> U3 P lyta
createInfoLayout :: U3 Layout.P lyta,
forall {k} (mn :: Maybe (*))
(ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> Maybe (Either (U2 C bpha) Int32)
createInfoBasePipelineHandleOrIndex ::
Maybe (Either (U2 C bpha) Int32) }
createInfoToMiddle ::
(WithPoked (TMaybe.M n'), AllocationCallbacks.ToMiddle mscc) =>
Device.D ds ->
CreateInfo n '(n1, n', 'GlslComputeShader, mscc, vs) lyta bpha ->
IO (M.CreateInfo n n1 vs)
createInfoToMiddle :: forall {k} (n' :: Maybe (*)) (mscc :: Maybe (*, *)) ds
(n :: Maybe (*)) (n1 :: Maybe (*)) (vs :: [*])
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
(WithPoked (M n'), ToMiddle mscc) =>
D ds
-> CreateInfo n '(n1, n', 'GlslComputeShader, mscc, vs) lyta bpha
-> IO (CreateInfo n n1 vs)
createInfoToMiddle D ds
dvc CreateInfo {
createInfoNext :: forall {k} (mn :: Maybe (*))
(ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> M mn
createInfoNext = M n
mnxt,
createInfoFlags :: forall {k} (mn :: Maybe (*))
(ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> CreateFlags
createInfoFlags = CreateFlags
flgs,
createInfoStage :: forall {k} (mn :: Maybe (*))
(ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> U5 CreateInfo ssta
createInfoStage = U5 CreateInfo s1 s2 s3 s4 s5
stg,
createInfoLayout :: forall {k} (mn :: Maybe (*))
(ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> U3 P lyta
createInfoLayout = U3 (Layout.P P
lyt),
createInfoBasePipelineHandleOrIndex :: forall {k} (mn :: Maybe (*))
(ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> Maybe (Either (U2 C bpha) Int32)
createInfoBasePipelineHandleOrIndex = Maybe (Either (U2 C bpha) Int32)
mbphi } = do
stg' <- D ds -> CreateInfo s1 s2 s3 s4 s5 -> IO (CreateInfo s1 s3 s5)
forall (mnsm :: Maybe (*)) (mac :: Maybe (*, *)) ds
(n :: Maybe (*)) (sknd :: ShaderKind) (vs :: [*]).
(WithPoked (M mnsm), ToMiddle mac) =>
D ds -> CreateInfo n mnsm sknd mac vs -> IO (CreateInfo n sknd vs)
ShaderStage.createInfoToMiddle D ds
dvc CreateInfo s1 s2 s3 s4 s5
stg
let (bph, bpi) = case mbphi of
Maybe (Either (U2 C bpha) Int32)
Nothing -> (Maybe C
forall a. Maybe a
Nothing, Maybe Int32
forall a. Maybe a
Nothing)
Just (Left (U2 (C C
h))) -> (C -> Maybe C
forall a. a -> Maybe a
Just C
h, Maybe Int32
forall a. Maybe a
Nothing)
Just (Right Int32
i) -> (Maybe C
forall a. Maybe a
Nothing, Int32 -> Maybe Int32
forall a. a -> Maybe a
Just Int32
i)
pure M.CreateInfo {
M.createInfoNext = mnxt,
M.createInfoFlags = flgs,
M.createInfoStage = stg',
M.createInfoLayout = lyt,
M.createInfoBasePipelineHandle = bph,
M.createInfoBasePipelineIndex = bpi }
class ( M.CreateInfoListToCore (MiddleArgs as),
DestroyCreateInfoMiddleList (MiddleArgs as) as ) =>
CreateInfoListToMiddle as where
type MiddleArgs as :: [(Maybe Type, Maybe Type, [Type])]
createInfoListToMiddle ::
Device.D sd -> HeteroParList.PL (U4 CreateInfo) as ->
IO (HeteroParList.PL (U3 M.CreateInfo) (MiddleArgs as))
instance CreateInfoListToMiddle '[] where
type MiddleArgs '[] = '[]
createInfoListToMiddle :: forall sd.
D sd
-> PL (U4 CreateInfo) '[]
-> IO (PL (U3 CreateInfo) (MiddleArgs '[]))
createInfoListToMiddle D sd
_ PL (U4 CreateInfo) '[]
HeteroParList.Nil = PL (U3 CreateInfo) '[] -> IO (PL (U3 CreateInfo) '[])
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure PL (U3 CreateInfo) '[]
forall {k} (t :: k -> *). PL t '[]
HeteroParList.Nil
instance (
WithPoked (TMaybe.M n'), CreateInfoListToMiddle as,
AllocationCallbacks.ToMiddle mscc,
WithPoked (TMaybe.M n), WithPoked (TMaybe.M n1), PokableList vs
) =>
CreateInfoListToMiddle (
'(n, '(n1, n', 'GlslComputeShader, mscc, vs), lyta, bpha
) ': as) where
type MiddleArgs (
'(n, '(n1, n', 'GlslComputeShader, mscc, vs), lyta, bpha) ':
as ) = '(n, n1, vs) ': MiddleArgs as
createInfoListToMiddle :: forall sd.
D sd
-> PL
(U4 CreateInfo)
('(n, '(n1, n', 'GlslComputeShader, mscc, vs), lyta, bpha) : as)
-> IO
(PL
(U3 CreateInfo)
(MiddleArgs
('(n, '(n1, n', 'GlslComputeShader, mscc, vs), lyta, bpha) : as)))
createInfoListToMiddle D sd
dvc (U4 CreateInfo s1 s2 s3 s4
ci :** PL (U4 CreateInfo) ss1
cis) = U3 CreateInfo '(s1, n1, vs)
-> PL (U3 CreateInfo) (MiddleArgs as)
-> PL (U3 CreateInfo) ('(s1, n1, vs) : MiddleArgs as)
forall {k} (t :: k -> *) (s :: k) (ss1 :: [k]).
t s -> PL t ss1 -> PL t (s : ss1)
(:**)
(U3 CreateInfo '(s1, n1, vs)
-> PL (U3 CreateInfo) (MiddleArgs as)
-> PL (U3 CreateInfo) ('(s1, n1, vs) : MiddleArgs as))
-> IO (U3 CreateInfo '(s1, n1, vs))
-> IO
(PL (U3 CreateInfo) (MiddleArgs as)
-> PL (U3 CreateInfo) ('(s1, n1, vs) : MiddleArgs as))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (CreateInfo s1 n1 vs -> U3 CreateInfo '(s1, n1, vs)
forall {k} {k1} {k2} (t :: k -> k1 -> k2 -> *) (s1 :: k) (s2 :: k1)
(s3 :: k2).
t s1 s2 s3 -> U3 t '(s1, s2, s3)
U3 (CreateInfo s1 n1 vs -> U3 CreateInfo '(s1, n1, vs))
-> IO (CreateInfo s1 n1 vs) -> IO (U3 CreateInfo '(s1, n1, vs))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> D sd
-> CreateInfo s1 '(n1, n', 'GlslComputeShader, mscc, vs) s3 s4
-> IO (CreateInfo s1 n1 vs)
forall {k} (n' :: Maybe (*)) (mscc :: Maybe (*, *)) ds
(n :: Maybe (*)) (n1 :: Maybe (*)) (vs :: [*])
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
(WithPoked (M n'), ToMiddle mscc) =>
D ds
-> CreateInfo n '(n1, n', 'GlslComputeShader, mscc, vs) lyta bpha
-> IO (CreateInfo n n1 vs)
createInfoToMiddle D sd
dvc CreateInfo s1 s2 s3 s4
CreateInfo s1 '(n1, n', 'GlslComputeShader, mscc, vs) s3 s4
ci)
IO
(PL (U3 CreateInfo) (MiddleArgs as)
-> PL (U3 CreateInfo) ('(s1, n1, vs) : MiddleArgs as))
-> IO (PL (U3 CreateInfo) (MiddleArgs as))
-> IO (PL (U3 CreateInfo) ('(s1, n1, vs) : MiddleArgs as))
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 (U4 CreateInfo) ss1
-> IO (PL (U3 CreateInfo) (MiddleArgs ss1))
forall sd.
D sd
-> PL (U4 CreateInfo) ss1
-> IO (PL (U3 CreateInfo) (MiddleArgs ss1))
forall {k}
(as :: [(Maybe (*),
(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]),
(*, [(*, [BindingType])], [*]),
(k, (*, [(*, [BindingType])], [*])))])
sd.
CreateInfoListToMiddle as =>
D sd
-> PL (U4 CreateInfo) as -> IO (PL (U3 CreateInfo) (MiddleArgs as))
createInfoListToMiddle D sd
dvc PL (U4 CreateInfo) ss1
cis
destroyCreateInfoMiddle ::
AllocationCallbacks.ToMiddle mscc =>
Device.D sd -> M.CreateInfo n n1 vs ->
CreateInfo n '(n1, n2, 'GlslComputeShader, mscc, vs) lyta bpha -> IO ()
destroyCreateInfoMiddle :: forall {k} (mscc :: Maybe (*, *)) sd (n :: Maybe (*))
(n1 :: Maybe (*)) (vs :: [*]) (n2 :: Maybe (*))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
ToMiddle mscc =>
D sd
-> CreateInfo n n1 vs
-> CreateInfo n '(n1, n2, 'GlslComputeShader, mscc, vs) lyta bpha
-> IO ()
destroyCreateInfoMiddle D sd
dvc CreateInfo n n1 vs
mci CreateInfo n '(n1, n2, 'GlslComputeShader, mscc, vs) lyta bpha
ci = D sd
-> CreateInfo n1 'GlslComputeShader vs -> M (U2 A) mscc -> IO ()
forall (mac :: Maybe (*, *)) sd (n :: Maybe (*))
(sknd :: ShaderKind) (vs :: [*]).
ToMiddle mac =>
D sd -> CreateInfo n sknd vs -> M (U2 A) mac -> IO ()
ShaderStage.destroyShaderModule D sd
dvc
(CreateInfo n n1 vs -> CreateInfo n1 'GlslComputeShader vs
forall (mn :: Maybe (*)) (ss :: Maybe (*)) (sivs :: [*]).
CreateInfo mn ss sivs -> CreateInfo ss 'GlslComputeShader sivs
M.createInfoStage CreateInfo n n1 vs
mci) ((\(U5 CreateInfo s1 s2 s3 s4 s5
s) -> (CreateInfo n2 'GlslComputeShader, M (U2 A) mscc) -> M (U2 A) mscc
forall a b. (a, b) -> b
snd ((CreateInfo n2 'GlslComputeShader, M (U2 A) mscc)
-> M (U2 A) mscc)
-> (CreateInfo n2 'GlslComputeShader, M (U2 A) mscc)
-> M (U2 A) mscc
forall a b. (a -> b) -> a -> b
$ CreateInfo n1 n2 'GlslComputeShader mscc vs
-> (CreateInfo n2 'GlslComputeShader, M (U2 A) mscc)
forall (mn :: Maybe (*)) (mnsm :: Maybe (*)) (sknd :: ShaderKind)
(mac :: Maybe (*, *)) (vs :: [*]).
CreateInfo mn mnsm sknd mac vs
-> (CreateInfo mnsm sknd, M (U2 A) mac)
ShaderStage.createInfoModule CreateInfo n1 n2 'GlslComputeShader mscc vs
CreateInfo s1 s2 s3 s4 s5
s) (U5 CreateInfo '(n1, n2, 'GlslComputeShader, mscc, vs)
-> M (U2 A) mscc)
-> U5 CreateInfo '(n1, n2, 'GlslComputeShader, mscc, vs)
-> M (U2 A) mscc
forall a b. (a -> b) -> a -> b
$ CreateInfo n '(n1, n2, 'GlslComputeShader, mscc, vs) lyta bpha
-> U5 CreateInfo '(n1, n2, 'GlslComputeShader, mscc, vs)
forall {k} (mn :: Maybe (*))
(ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> U5 CreateInfo ssta
createInfoStage CreateInfo n '(n1, n2, 'GlslComputeShader, mscc, vs) lyta bpha
ci)
class DestroyCreateInfoMiddleList vss vss' where
destroyCreateInfoMiddleList ::
Device.D sd ->
HeteroParList.PL (U3 M.CreateInfo) vss ->
HeteroParList.PL (U4 CreateInfo) vss' -> IO ()
instance DestroyCreateInfoMiddleList '[] '[] where
destroyCreateInfoMiddleList :: forall sd.
D sd -> PL (U3 CreateInfo) '[] -> PL (U4 CreateInfo) '[] -> IO ()
destroyCreateInfoMiddleList D sd
_ PL (U3 CreateInfo) '[]
HeteroParList.Nil PL (U4 CreateInfo) '[]
HeteroParList.Nil = () -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
instance (
DestroyCreateInfoMiddleList vss vss',
AllocationCallbacks.ToMiddle mscc ) =>
DestroyCreateInfoMiddleList
('(n, n1, vs) ': vss)
('(n, '(n1, n2, 'GlslComputeShader, mscc, vs), lyta, bpha) ': vss') where
destroyCreateInfoMiddleList :: forall sd.
D sd
-> PL (U3 CreateInfo) ('(n, n1, vs) : vss)
-> PL
(U4 CreateInfo)
('(n, '(n1, n2, 'GlslComputeShader, mscc, vs), lyta, bpha) : vss')
-> IO ()
destroyCreateInfoMiddleList D sd
dvc
(U3 CreateInfo s1 s2 s3
mci :** PL (U3 CreateInfo) ss1
mcis) (U4 CreateInfo s1 s2 s3 s4
ci :** PL (U4 CreateInfo) ss1
cis) = do
D sd
-> CreateInfo s1 s2 s3
-> CreateInfo s1 '(s2, n2, 'GlslComputeShader, mscc, s3) s3 s4
-> IO ()
forall {k} (mscc :: Maybe (*, *)) sd (n :: Maybe (*))
(n1 :: Maybe (*)) (vs :: [*]) (n2 :: Maybe (*))
(lyta :: (*, [(*, [BindingType])], [*]))
(bpha :: (k, (*, [(*, [BindingType])], [*]))).
ToMiddle mscc =>
D sd
-> CreateInfo n n1 vs
-> CreateInfo n '(n1, n2, 'GlslComputeShader, mscc, vs) lyta bpha
-> IO ()
destroyCreateInfoMiddle D sd
dvc CreateInfo s1 s2 s3
mci CreateInfo s1 '(s2, n2, 'GlslComputeShader, mscc, s3) s3 s4
CreateInfo s1 s2 s3 s4
ci
D sd -> PL (U3 CreateInfo) ss1 -> PL (U4 CreateInfo) ss1 -> IO ()
forall sd.
D sd -> PL (U3 CreateInfo) ss1 -> PL (U4 CreateInfo) ss1 -> IO ()
forall {k} (vss :: [(Maybe (*), Maybe (*), [*])])
(vss' :: [(Maybe (*),
(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]),
(*, [(*, [BindingType])], [*]),
(k, (*, [(*, [BindingType])], [*])))])
sd.
DestroyCreateInfoMiddleList vss vss' =>
D sd -> PL (U3 CreateInfo) vss -> PL (U4 CreateInfo) vss' -> IO ()
destroyCreateInfoMiddleList D sd
dvc PL (U3 CreateInfo) ss1
mcis PL (U4 CreateInfo) ss1
cis
createCs :: (
CreateInfoListToMiddle cias, AllocationCallbacks.ToMiddle mac,
FromMiddleList (TMapIndex.M2_4 cias) ) =>
Device.D sd -> Maybe (Cache.P spc) -> HeteroParList.PL (U4 CreateInfo) cias ->
TPMaybe.M (U2 AllocationCallbacks.A) mac ->
(forall s . HeteroParList.PL (C s) (TMapIndex.M2_4 cias) -> IO a) -> IO a
createCs :: forall {k} {k}
(cias :: [(Maybe (*),
(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]),
(*, [(*, [BindingType])], [*]),
(k, (*, [(*, [BindingType])], [*])))])
(mac :: Maybe (*, *)) sd spc a.
(CreateInfoListToMiddle cias, ToMiddle mac,
FromMiddleList (M2_4 cias)) =>
D sd
-> Maybe (P spc)
-> PL (U4 CreateInfo) cias
-> M (U2 A) mac
-> (forall (s :: k). PL (C s) (M2_4 cias) -> IO a)
-> IO a
createCs dvc :: D sd
dvc@(Device.D D
mdvc) Maybe (P spc)
mcch PL (U4 CreateInfo) 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 A (Snd mac)
mac) forall (s :: k). PL (C s) (M2_4 cias) -> IO a
f = do
cis' <- D sd
-> PL (U4 CreateInfo) cias
-> IO (PL (U3 CreateInfo) (MiddleArgs cias))
forall sd.
D sd
-> PL (U4 CreateInfo) cias
-> IO (PL (U3 CreateInfo) (MiddleArgs cias))
forall {k}
(as :: [(Maybe (*),
(Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]),
(*, [(*, [BindingType])], [*]),
(k, (*, [(*, [BindingType])], [*])))])
sd.
CreateInfoListToMiddle as =>
D sd
-> PL (U4 CreateInfo) as -> IO (PL (U3 CreateInfo) (MiddleArgs as))
createInfoListToMiddle D sd
dvc PL (U4 CreateInfo) cias
cis
let mcch' = (\(Cache.P P
c) -> P
c) (P spc -> P) -> Maybe (P spc) -> Maybe P
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (P spc)
mcch
bracket
(M.createCs mdvc mcch' cis' mac
<* destroyCreateInfoMiddleList dvc cis' cis)
(mapM_ \C
c -> D -> C -> M A (Snd mac) -> IO ()
forall (md :: Maybe (*)). D -> C -> M A md -> IO ()
M.destroy D
mdvc C
c M A (Snd mac)
mac)
(f . fromMiddleList)
class FromMiddleList ss where
fromMiddleList :: [M.C] -> HeteroParList.PL (C sc) ss
instance FromMiddleList '[] where fromMiddleList :: forall {k} (sc :: k). [C] -> PL (C sc) '[]
fromMiddleList [] = PL (C sc) '[]
forall {k} (t :: k -> *). PL t '[]
HeteroParList.Nil
instance FromMiddleList ss => FromMiddleList (s ': ss) where
fromMiddleList :: forall {k} (sc :: k). [C] -> PL (C sc) (s : ss)
fromMiddleList (C
c : [C]
cs) = C -> C sc s
forall {k} (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
C -> C s lyta
C C
c C sc s -> PL (C sc) ss -> PL (C sc) (s : ss)
forall {k} (t :: k -> *) (s :: k) (ss1 :: [k]).
t s -> PL t ss1 -> PL t (s : ss1)
:** [C] -> PL (C sc) ss
forall (ss :: [(*, [(*, [BindingType])], [*])]) {k} (sc :: k).
FromMiddleList ss =>
[C] -> PL (C sc) ss
forall {k} (sc :: k). [C] -> PL (C sc) ss
fromMiddleList [C]
cs