{-# language CPP #-}
module Vulkan.Extensions.VK_KHR_pipeline_library ( PipelineLibraryCreateInfoKHR(..)
, KHR_PIPELINE_LIBRARY_SPEC_VERSION
, pattern KHR_PIPELINE_LIBRARY_SPEC_VERSION
, KHR_PIPELINE_LIBRARY_EXTENSION_NAME
, pattern KHR_PIPELINE_LIBRARY_EXTENSION_NAME
) where
import Foreign.Marshal.Alloc (allocaBytes)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (evalContT)
import Data.Vector (generateM)
import qualified Data.Vector (imapM_)
import qualified Data.Vector (length)
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Zero (Zero(..))
import Data.String (IsString)
import Data.Typeable (Typeable)
import Foreign.Storable (Storable(peek))
import Foreign.Storable (Storable(poke))
import GHC.Generics (Generic)
import Foreign.Ptr (Ptr)
import Data.Word (Word32)
import Data.Kind (Type)
import Control.Monad.Trans.Cont (ContT(..))
import Data.Vector (Vector)
import Vulkan.CStruct.Utils (advancePtrBytes)
import Vulkan.Core10.Handles (Pipeline)
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR))
data PipelineLibraryCreateInfoKHR = PipelineLibraryCreateInfoKHR
{
PipelineLibraryCreateInfoKHR -> Vector Pipeline
libraries :: Vector Pipeline }
deriving (Typeable)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PipelineLibraryCreateInfoKHR)
#endif
deriving instance Show PipelineLibraryCreateInfoKHR
instance ToCStruct PipelineLibraryCreateInfoKHR where
withCStruct :: forall b.
PipelineLibraryCreateInfoKHR
-> (Ptr PipelineLibraryCreateInfoKHR -> IO b) -> IO b
withCStruct PipelineLibraryCreateInfoKHR
x Ptr PipelineLibraryCreateInfoKHR -> IO b
f = forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
32 forall a b. (a -> b) -> a -> b
$ \Ptr PipelineLibraryCreateInfoKHR
p -> forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PipelineLibraryCreateInfoKHR
p PipelineLibraryCreateInfoKHR
x (Ptr PipelineLibraryCreateInfoKHR -> IO b
f Ptr PipelineLibraryCreateInfoKHR
p)
pokeCStruct :: forall b.
Ptr PipelineLibraryCreateInfoKHR
-> PipelineLibraryCreateInfoKHR -> IO b -> IO b
pokeCStruct Ptr PipelineLibraryCreateInfoKHR
p PipelineLibraryCreateInfoKHR{Vector Pipeline
libraries :: Vector Pipeline
$sel:libraries:PipelineLibraryCreateInfoKHR :: PipelineLibraryCreateInfoKHR -> Vector Pipeline
..} IO b
f = forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT forall a b. (a -> b) -> a -> b
$ do
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineLibraryCreateInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineLibraryCreateInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineLibraryCreateInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Word32)) ((forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Vector a -> Int
Data.Vector.length forall a b. (a -> b) -> a -> b
$ (Vector Pipeline
libraries)) :: Word32))
Ptr Pipeline
pPLibraries' <- forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes @Pipeline ((forall a. Vector a -> Int
Data.Vector.length (Vector Pipeline
libraries)) forall a. Num a => a -> a -> a
* Int
8)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\Int
i Pipeline
e -> forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Pipeline
pPLibraries' forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
8 forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr Pipeline) (Pipeline
e)) (Vector Pipeline
libraries)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineLibraryCreateInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr (Ptr Pipeline))) (Ptr Pipeline
pPLibraries')
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ IO b
f
cStructSize :: Int
cStructSize = Int
32
cStructAlignment :: Int
cStructAlignment = Int
8
pokeZeroCStruct :: forall b. Ptr PipelineLibraryCreateInfoKHR -> IO b -> IO b
pokeZeroCStruct Ptr PipelineLibraryCreateInfoKHR
p IO b
f = do
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineLibraryCreateInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR)
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineLibraryCreateInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
IO b
f
instance FromCStruct PipelineLibraryCreateInfoKHR where
peekCStruct :: Ptr PipelineLibraryCreateInfoKHR -> IO PipelineLibraryCreateInfoKHR
peekCStruct Ptr PipelineLibraryCreateInfoKHR
p = do
Word32
libraryCount <- forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PipelineLibraryCreateInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Word32))
Ptr Pipeline
pLibraries <- forall a. Storable a => Ptr a -> IO a
peek @(Ptr Pipeline) ((Ptr PipelineLibraryCreateInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr (Ptr Pipeline)))
Vector Pipeline
pLibraries' <- forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> m a) -> m (Vector a)
generateM (forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
libraryCount) (\Int
i -> forall a. Storable a => Ptr a -> IO a
peek @Pipeline ((Ptr Pipeline
pLibraries forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (Int
8 forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr Pipeline)))
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Vector Pipeline -> PipelineLibraryCreateInfoKHR
PipelineLibraryCreateInfoKHR
Vector Pipeline
pLibraries'
instance Zero PipelineLibraryCreateInfoKHR where
zero :: PipelineLibraryCreateInfoKHR
zero = Vector Pipeline -> PipelineLibraryCreateInfoKHR
PipelineLibraryCreateInfoKHR
forall a. Monoid a => a
mempty
type KHR_PIPELINE_LIBRARY_SPEC_VERSION = 1
pattern KHR_PIPELINE_LIBRARY_SPEC_VERSION :: forall a . Integral a => a
pattern $bKHR_PIPELINE_LIBRARY_SPEC_VERSION :: forall a. Integral a => a
$mKHR_PIPELINE_LIBRARY_SPEC_VERSION :: forall {r} {a}.
Integral a =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
KHR_PIPELINE_LIBRARY_SPEC_VERSION = 1
type KHR_PIPELINE_LIBRARY_EXTENSION_NAME = "VK_KHR_pipeline_library"
pattern KHR_PIPELINE_LIBRARY_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $bKHR_PIPELINE_LIBRARY_EXTENSION_NAME :: forall a. (Eq a, IsString a) => a
$mKHR_PIPELINE_LIBRARY_EXTENSION_NAME :: forall {r} {a}.
(Eq a, IsString a) =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
KHR_PIPELINE_LIBRARY_EXTENSION_NAME = "VK_KHR_pipeline_library"