{-# language CPP #-}
-- No documentation found for Chapter "Promoted_From_VK_KHR_descriptor_update_template"
module Vulkan.Core11.Promoted_From_VK_KHR_descriptor_update_template  ( createDescriptorUpdateTemplate
                                                                      , withDescriptorUpdateTemplate
                                                                      , destroyDescriptorUpdateTemplate
                                                                      , updateDescriptorSetWithTemplate
                                                                      , DescriptorUpdateTemplateEntry(..)
                                                                      , DescriptorUpdateTemplateCreateInfo(..)
                                                                      , DescriptorUpdateTemplate(..)
                                                                      , DescriptorUpdateTemplateCreateFlags(..)
                                                                      , StructureType(..)
                                                                      , DescriptorUpdateTemplateType(..)
                                                                      , ObjectType(..)
                                                                      ) where

import Vulkan.Internal.Utils (traceAroundEvent)
import Control.Exception.Base (bracket)
import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Foreign.Marshal.Alloc (allocaBytes)
import Foreign.Marshal.Alloc (callocBytes)
import Foreign.Marshal.Alloc (free)
import GHC.Base (when)
import GHC.IO (throwIO)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import Data.Coerce (coerce)
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 Control.Monad.IO.Class (MonadIO)
import Data.Typeable (Typeable)
import Foreign.C.Types (CSize)
import Foreign.C.Types (CSize(..))
import Foreign.C.Types (CSize(CSize))
import Foreign.Storable (Storable)
import Foreign.Storable (Storable(peek))
import Foreign.Storable (Storable(poke))
import qualified Foreign.Storable (Storable(..))
import GHC.Generics (Generic)
import GHC.IO.Exception (IOErrorType(..))
import GHC.IO.Exception (IOException(..))
import Foreign.Ptr (FunPtr)
import Foreign.Ptr (Ptr)
import Data.Word (Word32)
import Data.Word (Word64)
import Data.Kind (Type)
import Control.Monad.Trans.Cont (ContT(..))
import Data.Vector (Vector)
import Vulkan.CStruct.Utils (advancePtrBytes)
import Vulkan.NamedType ((:::))
import Vulkan.Core10.AllocationCallbacks (AllocationCallbacks)
import Vulkan.Core10.Handles (DescriptorSet)
import Vulkan.Core10.Handles (DescriptorSet(..))
import Vulkan.Core10.Handles (DescriptorSetLayout)
import Vulkan.Core10.Enums.DescriptorType (DescriptorType)
import Vulkan.Core11.Handles (DescriptorUpdateTemplate)
import Vulkan.Core11.Handles (DescriptorUpdateTemplate(..))
import Vulkan.Core11.Enums.DescriptorUpdateTemplateCreateFlags (DescriptorUpdateTemplateCreateFlags)
import Vulkan.Core11.Enums.DescriptorUpdateTemplateType (DescriptorUpdateTemplateType)
import Vulkan.Core10.Handles (Device)
import Vulkan.Core10.Handles (Device(..))
import Vulkan.Core10.Handles (Device(Device))
import Vulkan.Dynamic (DeviceCmds(pVkCreateDescriptorUpdateTemplate))
import Vulkan.Dynamic (DeviceCmds(pVkDestroyDescriptorUpdateTemplate))
import Vulkan.Dynamic (DeviceCmds(pVkUpdateDescriptorSetWithTemplate))
import Vulkan.Core10.Handles (Device_T)
import Vulkan.Core10.Enums.PipelineBindPoint (PipelineBindPoint)
import Vulkan.Core10.Handles (PipelineLayout)
import Vulkan.Core10.Enums.Result (Result)
import Vulkan.Core10.Enums.Result (Result(..))
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.Exception (VulkanException(..))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO))
import Vulkan.Core10.Enums.Result (Result(SUCCESS))
import Vulkan.Core11.Handles (DescriptorUpdateTemplate(..))
import Vulkan.Core11.Enums.DescriptorUpdateTemplateCreateFlags (DescriptorUpdateTemplateCreateFlags(..))
import Vulkan.Core11.Enums.DescriptorUpdateTemplateType (DescriptorUpdateTemplateType(..))
import Vulkan.Core10.Enums.ObjectType (ObjectType(..))
import Vulkan.Core10.Enums.StructureType (StructureType(..))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCreateDescriptorUpdateTemplate
  :: FunPtr (Ptr Device_T -> Ptr DescriptorUpdateTemplateCreateInfo -> Ptr AllocationCallbacks -> Ptr DescriptorUpdateTemplate -> IO Result) -> Ptr Device_T -> Ptr DescriptorUpdateTemplateCreateInfo -> Ptr AllocationCallbacks -> Ptr DescriptorUpdateTemplate -> IO Result

-- | vkCreateDescriptorUpdateTemplate - Create a new descriptor update
-- template
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkCreateDescriptorUpdateTemplate-device-parameter# @device@
--     /must/ be a valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   #VUID-vkCreateDescriptorUpdateTemplate-pCreateInfo-parameter#
--     @pCreateInfo@ /must/ be a valid pointer to a valid
--     'DescriptorUpdateTemplateCreateInfo' structure
--
-- -   #VUID-vkCreateDescriptorUpdateTemplate-pAllocator-parameter# If
--     @pAllocator@ is not @NULL@, @pAllocator@ /must/ be a valid pointer
--     to a valid 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks'
--     structure
--
-- -   #VUID-vkCreateDescriptorUpdateTemplate-pDescriptorUpdateTemplate-parameter#
--     @pDescriptorUpdateTemplate@ /must/ be a valid pointer to a
--     'Vulkan.Core11.Handles.DescriptorUpdateTemplate' handle
--
-- == Return Codes
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-successcodes Success>]
--
--     -   'Vulkan.Core10.Enums.Result.SUCCESS'
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-errorcodes Failure>]
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_HOST_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_DEVICE_MEMORY'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks',
-- 'Vulkan.Core11.Handles.DescriptorUpdateTemplate',
-- 'DescriptorUpdateTemplateCreateInfo', 'Vulkan.Core10.Handles.Device'
createDescriptorUpdateTemplate :: forall io
                                . (MonadIO io)
                               => -- | @device@ is the logical device that creates the descriptor update
                                  -- template.
                                  Device
                               -> -- | @pCreateInfo@ is a pointer to a 'DescriptorUpdateTemplateCreateInfo'
                                  -- structure specifying the set of descriptors to update with a single call
                                  -- to
                                  -- 'Vulkan.Extensions.VK_KHR_push_descriptor.cmdPushDescriptorSetWithTemplateKHR'
                                  -- or 'updateDescriptorSetWithTemplate'.
                                  DescriptorUpdateTemplateCreateInfo
                               -> -- | @pAllocator@ controls host memory allocation as described in the
                                  -- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#memory-allocation Memory Allocation>
                                  -- chapter.
                                  ("allocator" ::: Maybe AllocationCallbacks)
                               -> io (DescriptorUpdateTemplate)
createDescriptorUpdateTemplate :: forall (io :: * -> *).
MonadIO io =>
Device
-> DescriptorUpdateTemplateCreateInfo
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io DescriptorUpdateTemplate
createDescriptorUpdateTemplate Device
device
                                 DescriptorUpdateTemplateCreateInfo
createInfo
                                 "allocator" ::: Maybe AllocationCallbacks
allocator = IO DescriptorUpdateTemplate -> io DescriptorUpdateTemplate
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO DescriptorUpdateTemplate -> io DescriptorUpdateTemplate)
-> (ContT DescriptorUpdateTemplate IO DescriptorUpdateTemplate
    -> IO DescriptorUpdateTemplate)
-> ContT DescriptorUpdateTemplate IO DescriptorUpdateTemplate
-> io DescriptorUpdateTemplate
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT DescriptorUpdateTemplate IO DescriptorUpdateTemplate
-> IO DescriptorUpdateTemplate
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT DescriptorUpdateTemplate IO DescriptorUpdateTemplate
 -> io DescriptorUpdateTemplate)
-> ContT DescriptorUpdateTemplate IO DescriptorUpdateTemplate
-> io DescriptorUpdateTemplate
forall a b. (a -> b) -> a -> b
$ do
  let vkCreateDescriptorUpdateTemplatePtr :: FunPtr
  (Ptr Device_T
   -> ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
   -> IO Result)
vkCreateDescriptorUpdateTemplatePtr = DeviceCmds
-> FunPtr
     (Ptr Device_T
      -> ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
      -> ("pAllocator" ::: Ptr AllocationCallbacks)
      -> ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
      -> IO Result)
pVkCreateDescriptorUpdateTemplate (case Device
device of Device{DeviceCmds
$sel:deviceCmds:Device :: Device -> DeviceCmds
deviceCmds :: DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  IO () -> ContT DescriptorUpdateTemplate IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT DescriptorUpdateTemplate IO ())
-> IO () -> ContT DescriptorUpdateTemplate IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T
   -> ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
   -> IO Result)
vkCreateDescriptorUpdateTemplatePtr FunPtr
  (Ptr Device_T
   -> ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
   -> IO Result)
-> FunPtr
     (Ptr Device_T
      -> ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
      -> ("pAllocator" ::: Ptr AllocationCallbacks)
      -> ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
      -> IO Result)
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr Device_T
   -> ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
   -> IO Result)
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument String
"" String
"The function pointer for vkCreateDescriptorUpdateTemplate is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCreateDescriptorUpdateTemplate' :: Ptr Device_T
-> ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
-> IO Result
vkCreateDescriptorUpdateTemplate' = FunPtr
  (Ptr Device_T
   -> ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
   -> IO Result)
-> Ptr Device_T
-> ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
-> IO Result
mkVkCreateDescriptorUpdateTemplate FunPtr
  (Ptr Device_T
   -> ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
   -> IO Result)
vkCreateDescriptorUpdateTemplatePtr
  "pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
pCreateInfo <- ((("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
  -> IO DescriptorUpdateTemplate)
 -> IO DescriptorUpdateTemplate)
-> ContT
     DescriptorUpdateTemplate
     IO
     ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
   -> IO DescriptorUpdateTemplate)
  -> IO DescriptorUpdateTemplate)
 -> ContT
      DescriptorUpdateTemplate
      IO
      ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo))
-> ((("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
     -> IO DescriptorUpdateTemplate)
    -> IO DescriptorUpdateTemplate)
-> ContT
     DescriptorUpdateTemplate
     IO
     ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
forall a b. (a -> b) -> a -> b
$ DescriptorUpdateTemplateCreateInfo
-> (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
    -> IO DescriptorUpdateTemplate)
-> IO DescriptorUpdateTemplate
forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b
withCStruct (DescriptorUpdateTemplateCreateInfo
createInfo)
  "pAllocator" ::: Ptr AllocationCallbacks
pAllocator <- case ("allocator" ::: Maybe AllocationCallbacks
allocator) of
    "allocator" ::: Maybe AllocationCallbacks
Nothing -> ("pAllocator" ::: Ptr AllocationCallbacks)
-> ContT
     DescriptorUpdateTemplate
     IO
     ("pAllocator" ::: Ptr AllocationCallbacks)
forall (f :: * -> *) a. Applicative f => a -> f a
pure "pAllocator" ::: Ptr AllocationCallbacks
forall a. Ptr a
nullPtr
    Just AllocationCallbacks
j -> ((("pAllocator" ::: Ptr AllocationCallbacks)
  -> IO DescriptorUpdateTemplate)
 -> IO DescriptorUpdateTemplate)
-> ContT
     DescriptorUpdateTemplate
     IO
     ("pAllocator" ::: Ptr AllocationCallbacks)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pAllocator" ::: Ptr AllocationCallbacks)
   -> IO DescriptorUpdateTemplate)
  -> IO DescriptorUpdateTemplate)
 -> ContT
      DescriptorUpdateTemplate
      IO
      ("pAllocator" ::: Ptr AllocationCallbacks))
-> ((("pAllocator" ::: Ptr AllocationCallbacks)
     -> IO DescriptorUpdateTemplate)
    -> IO DescriptorUpdateTemplate)
-> ContT
     DescriptorUpdateTemplate
     IO
     ("pAllocator" ::: Ptr AllocationCallbacks)
forall a b. (a -> b) -> a -> b
$ AllocationCallbacks
-> (("pAllocator" ::: Ptr AllocationCallbacks)
    -> IO DescriptorUpdateTemplate)
-> IO DescriptorUpdateTemplate
forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b
withCStruct (AllocationCallbacks
j)
  "pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate
pPDescriptorUpdateTemplate <- ((("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
  -> IO DescriptorUpdateTemplate)
 -> IO DescriptorUpdateTemplate)
-> ContT
     DescriptorUpdateTemplate
     IO
     ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
   -> IO DescriptorUpdateTemplate)
  -> IO DescriptorUpdateTemplate)
 -> ContT
      DescriptorUpdateTemplate
      IO
      ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate))
-> ((("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
     -> IO DescriptorUpdateTemplate)
    -> IO DescriptorUpdateTemplate)
-> ContT
     DescriptorUpdateTemplate
     IO
     ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
forall a b. (a -> b) -> a -> b
$ IO ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
-> (("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
    -> IO ())
-> (("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
    -> IO DescriptorUpdateTemplate)
-> IO DescriptorUpdateTemplate
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (forall a. Int -> IO (Ptr a)
callocBytes @DescriptorUpdateTemplate Int
8) ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
-> IO ()
forall a. Ptr a -> IO ()
free
  Result
r <- IO Result -> ContT DescriptorUpdateTemplate IO Result
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO Result -> ContT DescriptorUpdateTemplate IO Result)
-> IO Result -> ContT DescriptorUpdateTemplate IO Result
forall a b. (a -> b) -> a -> b
$ String -> IO Result -> IO Result
forall a. String -> IO a -> IO a
traceAroundEvent String
"vkCreateDescriptorUpdateTemplate" (Ptr Device_T
-> ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate)
-> IO Result
vkCreateDescriptorUpdateTemplate'
                                                                     (Device -> Ptr Device_T
deviceHandle (Device
device))
                                                                     "pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
pCreateInfo
                                                                     "pAllocator" ::: Ptr AllocationCallbacks
pAllocator
                                                                     ("pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate
pPDescriptorUpdateTemplate))
  IO () -> ContT DescriptorUpdateTemplate IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT DescriptorUpdateTemplate IO ())
-> IO () -> ContT DescriptorUpdateTemplate IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Result
r Result -> Result -> Bool
forall a. Ord a => a -> a -> Bool
< Result
SUCCESS) (VulkanException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (Result -> VulkanException
VulkanException Result
r))
  DescriptorUpdateTemplate
pDescriptorUpdateTemplate <- IO DescriptorUpdateTemplate
-> ContT DescriptorUpdateTemplate IO DescriptorUpdateTemplate
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO DescriptorUpdateTemplate
 -> ContT DescriptorUpdateTemplate IO DescriptorUpdateTemplate)
-> IO DescriptorUpdateTemplate
-> ContT DescriptorUpdateTemplate IO DescriptorUpdateTemplate
forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> IO a
peek @DescriptorUpdateTemplate "pDescriptorUpdateTemplate" ::: Ptr DescriptorUpdateTemplate
pPDescriptorUpdateTemplate
  DescriptorUpdateTemplate
-> ContT DescriptorUpdateTemplate IO DescriptorUpdateTemplate
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DescriptorUpdateTemplate
 -> ContT DescriptorUpdateTemplate IO DescriptorUpdateTemplate)
-> DescriptorUpdateTemplate
-> ContT DescriptorUpdateTemplate IO DescriptorUpdateTemplate
forall a b. (a -> b) -> a -> b
$ (DescriptorUpdateTemplate
pDescriptorUpdateTemplate)

-- | A convenience wrapper to make a compatible pair of calls to
-- 'createDescriptorUpdateTemplate' and 'destroyDescriptorUpdateTemplate'
--
-- To ensure that 'destroyDescriptorUpdateTemplate' is always called: pass
-- 'Control.Exception.bracket' (or the allocate function from your
-- favourite resource management library) as the last argument.
-- To just extract the pair pass '(,)' as the last argument.
--
withDescriptorUpdateTemplate :: forall io r . MonadIO io => Device -> DescriptorUpdateTemplateCreateInfo -> Maybe AllocationCallbacks -> (io DescriptorUpdateTemplate -> (DescriptorUpdateTemplate -> io ()) -> r) -> r
withDescriptorUpdateTemplate :: forall (io :: * -> *) r.
MonadIO io =>
Device
-> DescriptorUpdateTemplateCreateInfo
-> ("allocator" ::: Maybe AllocationCallbacks)
-> (io DescriptorUpdateTemplate
    -> (DescriptorUpdateTemplate -> io ()) -> r)
-> r
withDescriptorUpdateTemplate Device
device DescriptorUpdateTemplateCreateInfo
pCreateInfo "allocator" ::: Maybe AllocationCallbacks
pAllocator io DescriptorUpdateTemplate
-> (DescriptorUpdateTemplate -> io ()) -> r
b =
  io DescriptorUpdateTemplate
-> (DescriptorUpdateTemplate -> io ()) -> r
b (Device
-> DescriptorUpdateTemplateCreateInfo
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io DescriptorUpdateTemplate
forall (io :: * -> *).
MonadIO io =>
Device
-> DescriptorUpdateTemplateCreateInfo
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io DescriptorUpdateTemplate
createDescriptorUpdateTemplate Device
device DescriptorUpdateTemplateCreateInfo
pCreateInfo "allocator" ::: Maybe AllocationCallbacks
pAllocator)
    (\(DescriptorUpdateTemplate
o0) -> Device
-> DescriptorUpdateTemplate
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io ()
forall (io :: * -> *).
MonadIO io =>
Device
-> DescriptorUpdateTemplate
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io ()
destroyDescriptorUpdateTemplate Device
device DescriptorUpdateTemplate
o0 "allocator" ::: Maybe AllocationCallbacks
pAllocator)


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkDestroyDescriptorUpdateTemplate
  :: FunPtr (Ptr Device_T -> DescriptorUpdateTemplate -> Ptr AllocationCallbacks -> IO ()) -> Ptr Device_T -> DescriptorUpdateTemplate -> Ptr AllocationCallbacks -> IO ()

-- | vkDestroyDescriptorUpdateTemplate - Destroy a descriptor update template
-- object
--
-- == Valid Usage
--
-- -   #VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00356#
--     If 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks' were
--     provided when @descriptorUpdateTemplate@ was created, a compatible
--     set of callbacks /must/ be provided here
--
-- -   #VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00357#
--     If no 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks' were
--     provided when @descriptorUpdateTemplate@ was created, @pAllocator@
--     /must/ be @NULL@
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkDestroyDescriptorUpdateTemplate-device-parameter# @device@
--     /must/ be a valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   #VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parameter#
--     If @descriptorUpdateTemplate@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', @descriptorUpdateTemplate@
--     /must/ be a valid 'Vulkan.Core11.Handles.DescriptorUpdateTemplate'
--     handle
--
-- -   #VUID-vkDestroyDescriptorUpdateTemplate-pAllocator-parameter# If
--     @pAllocator@ is not @NULL@, @pAllocator@ /must/ be a valid pointer
--     to a valid 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks'
--     structure
--
-- -   #VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parent#
--     If @descriptorUpdateTemplate@ is a valid handle, it /must/ have been
--     created, allocated, or retrieved from @device@
--
-- == Host Synchronization
--
-- -   Host access to @descriptorUpdateTemplate@ /must/ be externally
--     synchronized
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks',
-- 'Vulkan.Core11.Handles.DescriptorUpdateTemplate',
-- 'Vulkan.Core10.Handles.Device'
destroyDescriptorUpdateTemplate :: forall io
                                 . (MonadIO io)
                                => -- | @device@ is the logical device that has been used to create the
                                   -- descriptor update template
                                   Device
                                -> -- | @descriptorUpdateTemplate@ is the descriptor update template to destroy.
                                   DescriptorUpdateTemplate
                                -> -- | @pAllocator@ controls host memory allocation as described in the
                                   -- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#memory-allocation Memory Allocation>
                                   -- chapter.
                                   ("allocator" ::: Maybe AllocationCallbacks)
                                -> io ()
destroyDescriptorUpdateTemplate :: forall (io :: * -> *).
MonadIO io =>
Device
-> DescriptorUpdateTemplate
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io ()
destroyDescriptorUpdateTemplate Device
device
                                  DescriptorUpdateTemplate
descriptorUpdateTemplate
                                  "allocator" ::: Maybe AllocationCallbacks
allocator = IO () -> io ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ())
-> (ContT () IO () -> IO ()) -> ContT () IO () -> io ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT () IO () -> IO ()
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT () IO () -> io ()) -> ContT () IO () -> io ()
forall a b. (a -> b) -> a -> b
$ do
  let vkDestroyDescriptorUpdateTemplatePtr :: FunPtr
  (Ptr Device_T
   -> DescriptorUpdateTemplate
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> IO ())
vkDestroyDescriptorUpdateTemplatePtr = DeviceCmds
-> FunPtr
     (Ptr Device_T
      -> DescriptorUpdateTemplate
      -> ("pAllocator" ::: Ptr AllocationCallbacks)
      -> IO ())
pVkDestroyDescriptorUpdateTemplate (case Device
device of Device{DeviceCmds
deviceCmds :: DeviceCmds
$sel:deviceCmds:Device :: Device -> DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  IO () -> ContT () IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T
   -> DescriptorUpdateTemplate
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> IO ())
vkDestroyDescriptorUpdateTemplatePtr FunPtr
  (Ptr Device_T
   -> DescriptorUpdateTemplate
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> IO ())
-> FunPtr
     (Ptr Device_T
      -> DescriptorUpdateTemplate
      -> ("pAllocator" ::: Ptr AllocationCallbacks)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr Device_T
   -> DescriptorUpdateTemplate
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument String
"" String
"The function pointer for vkDestroyDescriptorUpdateTemplate is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkDestroyDescriptorUpdateTemplate' :: Ptr Device_T
-> DescriptorUpdateTemplate
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> IO ()
vkDestroyDescriptorUpdateTemplate' = FunPtr
  (Ptr Device_T
   -> DescriptorUpdateTemplate
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> IO ())
-> Ptr Device_T
-> DescriptorUpdateTemplate
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> IO ()
mkVkDestroyDescriptorUpdateTemplate FunPtr
  (Ptr Device_T
   -> DescriptorUpdateTemplate
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> IO ())
vkDestroyDescriptorUpdateTemplatePtr
  "pAllocator" ::: Ptr AllocationCallbacks
pAllocator <- case ("allocator" ::: Maybe AllocationCallbacks
allocator) of
    "allocator" ::: Maybe AllocationCallbacks
Nothing -> ("pAllocator" ::: Ptr AllocationCallbacks)
-> ContT () IO ("pAllocator" ::: Ptr AllocationCallbacks)
forall (f :: * -> *) a. Applicative f => a -> f a
pure "pAllocator" ::: Ptr AllocationCallbacks
forall a. Ptr a
nullPtr
    Just AllocationCallbacks
j -> ((("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) -> IO ())
-> ContT () IO ("pAllocator" ::: Ptr AllocationCallbacks)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) -> IO ())
 -> ContT () IO ("pAllocator" ::: Ptr AllocationCallbacks))
-> ((("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) -> IO ())
-> ContT () IO ("pAllocator" ::: Ptr AllocationCallbacks)
forall a b. (a -> b) -> a -> b
$ AllocationCallbacks
-> (("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) -> IO ()
forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b
withCStruct (AllocationCallbacks
j)
  IO () -> ContT () IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ String -> IO () -> IO ()
forall a. String -> IO a -> IO a
traceAroundEvent String
"vkDestroyDescriptorUpdateTemplate" (Ptr Device_T
-> DescriptorUpdateTemplate
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> IO ()
vkDestroyDescriptorUpdateTemplate'
                                                                 (Device -> Ptr Device_T
deviceHandle (Device
device))
                                                                 (DescriptorUpdateTemplate
descriptorUpdateTemplate)
                                                                 "pAllocator" ::: Ptr AllocationCallbacks
pAllocator)
  () -> ContT () IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> ContT () IO ()) -> () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ ()


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkUpdateDescriptorSetWithTemplate
  :: FunPtr (Ptr Device_T -> DescriptorSet -> DescriptorUpdateTemplate -> Ptr () -> IO ()) -> Ptr Device_T -> DescriptorSet -> DescriptorUpdateTemplate -> Ptr () -> IO ()

-- | vkUpdateDescriptorSetWithTemplate - Update the contents of a descriptor
-- set object using an update template
--
-- == Valid Usage
--
-- -   #VUID-vkUpdateDescriptorSetWithTemplate-pData-01685# @pData@ /must/
--     be a valid pointer to a memory containing one or more valid
--     instances of 'Vulkan.Core10.DescriptorSet.DescriptorImageInfo',
--     'Vulkan.Core10.DescriptorSet.DescriptorBufferInfo', or
--     'Vulkan.Core10.Handles.BufferView' in a layout defined by
--     @descriptorUpdateTemplate@ when it was created with
--     'createDescriptorUpdateTemplate'
--
-- -   #VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-06995# Host
--     access to @descriptorSet@ /must/ be
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#fundamentals-threadingbehavior externally synchronized>
--     unless explicitly denoted otherwise for specific flags
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkUpdateDescriptorSetWithTemplate-device-parameter# @device@
--     /must/ be a valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   #VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-parameter#
--     @descriptorSet@ /must/ be a valid
--     'Vulkan.Core10.Handles.DescriptorSet' handle
--
-- -   #VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parameter#
--     @descriptorUpdateTemplate@ /must/ be a valid
--     'Vulkan.Core11.Handles.DescriptorUpdateTemplate' handle
--
-- -   #VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parent#
--     @descriptorUpdateTemplate@ /must/ have been created, allocated, or
--     retrieved from @device@
--
-- __API example__
--
-- > struct AppBufferView {
-- >     VkBufferView bufferView;
-- >     uint32_t     applicationRelatedInformation;
-- > };
-- >
-- > struct AppDataStructure
-- > {
-- >     VkDescriptorImageInfo  imageInfo;          // a single image info
-- >     VkDescriptorBufferInfo bufferInfoArray[3]; // 3 buffer infos in an array
-- >     AppBufferView          bufferView[2];      // An application defined structure containing a bufferView
-- >     // ... some more application related data
-- > };
-- >
-- > const VkDescriptorUpdateTemplateEntry descriptorUpdateTemplateEntries[] =
-- > {
-- >     // binding to a single image descriptor
-- >     {
-- >         0,                                           // binding
-- >         0,                                           // dstArrayElement
-- >         1,                                           // descriptorCount
-- >         VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,   // descriptorType
-- >         offsetof(AppDataStructure, imageInfo),       // offset
-- >         0                                            // stride is not required if descriptorCount is 1
-- >     },
-- >
-- >     // binding to an array of buffer descriptors
-- >     {
-- >         1,                                           // binding
-- >         0,                                           // dstArrayElement
-- >         3,                                           // descriptorCount
-- >         VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,           // descriptorType
-- >         offsetof(AppDataStructure, bufferInfoArray), // offset
-- >         sizeof(VkDescriptorBufferInfo)               // stride, descriptor buffer infos are compact
-- >     },
-- >
-- >     // binding to an array of buffer views
-- >     {
-- >         2,                                           // binding
-- >         0,                                           // dstArrayElement
-- >         2,                                           // descriptorCount
-- >         VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,     // descriptorType
-- >         offsetof(AppDataStructure, bufferView) +
-- >           offsetof(AppBufferView, bufferView),       // offset
-- >         sizeof(AppBufferView)                        // stride, bufferViews do not have to be compact
-- >     },
-- > };
-- >
-- > // create a descriptor update template for descriptor set updates
-- > const VkDescriptorUpdateTemplateCreateInfo createInfo =
-- > {
-- >     VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO,  // sType
-- >     NULL,                                                      // pNext
-- >     0,                                                         // flags
-- >     3,                                                         // descriptorUpdateEntryCount
-- >     descriptorUpdateTemplateEntries,                           // pDescriptorUpdateEntries
-- >     VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,         // templateType
-- >     myLayout,                                                  // descriptorSetLayout
-- >     0,                                                         // pipelineBindPoint, ignored by given templateType
-- >     0,                                                         // pipelineLayout, ignored by given templateType
-- >     0,                                                         // set, ignored by given templateType
-- > };
-- >
-- > VkDescriptorUpdateTemplate myDescriptorUpdateTemplate;
-- > myResult = vkCreateDescriptorUpdateTemplate(
-- >     myDevice,
-- >     &createInfo,
-- >     NULL,
-- >     &myDescriptorUpdateTemplate);
-- >
-- > AppDataStructure appData;
-- >
-- > // fill appData here or cache it in your engine
-- > vkUpdateDescriptorSetWithTemplate(myDevice, myDescriptorSet, myDescriptorUpdateTemplate, &appData);
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core10.Handles.DescriptorSet',
-- 'Vulkan.Core11.Handles.DescriptorUpdateTemplate',
-- 'Vulkan.Core10.Handles.Device'
updateDescriptorSetWithTemplate :: forall io
                                 . (MonadIO io)
                                => -- | @device@ is the logical device that updates the descriptor set.
                                   Device
                                -> -- | @descriptorSet@ is the descriptor set to update
                                   DescriptorSet
                                -> -- | @descriptorUpdateTemplate@ is a
                                   -- 'Vulkan.Core11.Handles.DescriptorUpdateTemplate' object specifying the
                                   -- update mapping between @pData@ and the descriptor set to update.
                                   DescriptorUpdateTemplate
                                -> -- | @pData@ is a pointer to memory containing one or more
                                   -- 'Vulkan.Core10.DescriptorSet.DescriptorImageInfo',
                                   -- 'Vulkan.Core10.DescriptorSet.DescriptorBufferInfo', or
                                   -- 'Vulkan.Core10.Handles.BufferView' structures or
                                   -- 'Vulkan.Extensions.Handles.AccelerationStructureKHR' or
                                   -- 'Vulkan.Extensions.Handles.AccelerationStructureNV' handles used to
                                   -- write the descriptors.
                                   ("data" ::: Ptr ())
                                -> io ()
updateDescriptorSetWithTemplate :: forall (io :: * -> *).
MonadIO io =>
Device
-> DescriptorSet
-> DescriptorUpdateTemplate
-> ("data" ::: Ptr ())
-> io ()
updateDescriptorSetWithTemplate Device
device
                                  DescriptorSet
descriptorSet
                                  DescriptorUpdateTemplate
descriptorUpdateTemplate
                                  "data" ::: Ptr ()
data' = IO () -> io ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ()) -> IO () -> io ()
forall a b. (a -> b) -> a -> b
$ do
  let vkUpdateDescriptorSetWithTemplatePtr :: FunPtr
  (Ptr Device_T
   -> DescriptorSet
   -> DescriptorUpdateTemplate
   -> ("data" ::: Ptr ())
   -> IO ())
vkUpdateDescriptorSetWithTemplatePtr = DeviceCmds
-> FunPtr
     (Ptr Device_T
      -> DescriptorSet
      -> DescriptorUpdateTemplate
      -> ("data" ::: Ptr ())
      -> IO ())
pVkUpdateDescriptorSetWithTemplate (case Device
device of Device{DeviceCmds
deviceCmds :: DeviceCmds
$sel:deviceCmds:Device :: Device -> DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T
   -> DescriptorSet
   -> DescriptorUpdateTemplate
   -> ("data" ::: Ptr ())
   -> IO ())
vkUpdateDescriptorSetWithTemplatePtr FunPtr
  (Ptr Device_T
   -> DescriptorSet
   -> DescriptorUpdateTemplate
   -> ("data" ::: Ptr ())
   -> IO ())
-> FunPtr
     (Ptr Device_T
      -> DescriptorSet
      -> DescriptorUpdateTemplate
      -> ("data" ::: Ptr ())
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr Device_T
   -> DescriptorSet
   -> DescriptorUpdateTemplate
   -> ("data" ::: Ptr ())
   -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument String
"" String
"The function pointer for vkUpdateDescriptorSetWithTemplate is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkUpdateDescriptorSetWithTemplate' :: Ptr Device_T
-> DescriptorSet
-> DescriptorUpdateTemplate
-> ("data" ::: Ptr ())
-> IO ()
vkUpdateDescriptorSetWithTemplate' = FunPtr
  (Ptr Device_T
   -> DescriptorSet
   -> DescriptorUpdateTemplate
   -> ("data" ::: Ptr ())
   -> IO ())
-> Ptr Device_T
-> DescriptorSet
-> DescriptorUpdateTemplate
-> ("data" ::: Ptr ())
-> IO ()
mkVkUpdateDescriptorSetWithTemplate FunPtr
  (Ptr Device_T
   -> DescriptorSet
   -> DescriptorUpdateTemplate
   -> ("data" ::: Ptr ())
   -> IO ())
vkUpdateDescriptorSetWithTemplatePtr
  String -> IO () -> IO ()
forall a. String -> IO a -> IO a
traceAroundEvent String
"vkUpdateDescriptorSetWithTemplate" (Ptr Device_T
-> DescriptorSet
-> DescriptorUpdateTemplate
-> ("data" ::: Ptr ())
-> IO ()
vkUpdateDescriptorSetWithTemplate'
                                                          (Device -> Ptr Device_T
deviceHandle (Device
device))
                                                          (DescriptorSet
descriptorSet)
                                                          (DescriptorUpdateTemplate
descriptorUpdateTemplate)
                                                          ("data" ::: Ptr ()
data'))
  () -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> IO ()) -> () -> IO ()
forall a b. (a -> b) -> a -> b
$ ()


-- | VkDescriptorUpdateTemplateEntry - Describes a single descriptor update
-- of the descriptor update template
--
-- == Valid Usage
--
-- -   #VUID-VkDescriptorUpdateTemplateEntry-dstBinding-00354# @dstBinding@
--     /must/ be a valid binding in the descriptor set layout implicitly
--     specified when using a descriptor update template to update
--     descriptors
--
-- -   #VUID-VkDescriptorUpdateTemplateEntry-dstArrayElement-00355#
--     @dstArrayElement@ and @descriptorCount@ /must/ be less than or equal
--     to the number of array elements in the descriptor set binding
--     implicitly specified when using a descriptor update template to
--     update descriptors, and all applicable consecutive bindings, as
--     described by
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#descriptorsets-updates-consecutive>
--
-- -   #VUID-VkDescriptorUpdateTemplateEntry-descriptor-02226# If
--     @descriptor@ type is
--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK',
--     @dstArrayElement@ /must/ be an integer multiple of @4@
--
-- -   #VUID-VkDescriptorUpdateTemplateEntry-descriptor-02227# If
--     @descriptor@ type is
--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK',
--     @descriptorCount@ /must/ be an integer multiple of @4@
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkDescriptorUpdateTemplateEntry-descriptorType-parameter#
--     @descriptorType@ /must/ be a valid
--     'Vulkan.Core10.Enums.DescriptorType.DescriptorType' value
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core10.Enums.DescriptorType.DescriptorType',
-- 'DescriptorUpdateTemplateCreateInfo'
data DescriptorUpdateTemplateEntry = DescriptorUpdateTemplateEntry
  { -- | @dstBinding@ is the descriptor binding to update when using this
    -- descriptor update template.
    DescriptorUpdateTemplateEntry -> Word32
dstBinding :: Word32
  , -- | @dstArrayElement@ is the starting element in the array belonging to
    -- @dstBinding@. If the descriptor binding identified by @dstBinding@ has a
    -- descriptor type of
    -- 'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK'
    -- then @dstArrayElement@ specifies the starting byte offset to update.
    DescriptorUpdateTemplateEntry -> Word32
dstArrayElement :: Word32
  , -- | @descriptorCount@ is the number of descriptors to update. If
    -- @descriptorCount@ is greater than the number of remaining array elements
    -- in the destination binding, those affect consecutive bindings in a
    -- manner similar to 'Vulkan.Core10.DescriptorSet.WriteDescriptorSet'
    -- above. If the descriptor binding identified by @dstBinding@ has a
    -- descriptor type of
    -- 'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK'
    -- then @descriptorCount@ specifies the number of bytes to update and the
    -- remaining array elements in the destination binding refer to the
    -- remaining number of bytes in it.
    DescriptorUpdateTemplateEntry -> Word32
descriptorCount :: Word32
  , -- | @descriptorType@ is a
    -- 'Vulkan.Core10.Enums.DescriptorType.DescriptorType' specifying the type
    -- of the descriptor.
    DescriptorUpdateTemplateEntry -> DescriptorType
descriptorType :: DescriptorType
  , -- | @offset@ is the offset in bytes of the first binding in the raw data
    -- structure.
    DescriptorUpdateTemplateEntry -> Word64
offset :: Word64
  , -- | @stride@ is the stride in bytes between two consecutive array elements
    -- of the descriptor update information in the raw data structure. The
    -- actual pointer ptr for each array element j of update entry i is
    -- computed using the following formula:
    --
    -- >     const char *ptr = (const char *)pData + pDescriptorUpdateEntries[i].offset + j * pDescriptorUpdateEntries[i].stride
    --
    -- The stride is useful in case the bindings are stored in structs along
    -- with other data. If @descriptorType@ is
    -- 'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK'
    -- then the value of @stride@ is ignored and the stride is assumed to be
    -- @1@, i.e. the descriptor update information for them is always specified
    -- as a contiguous range.
    DescriptorUpdateTemplateEntry -> Word64
stride :: Word64
  }
  deriving (Typeable, DescriptorUpdateTemplateEntry
-> DescriptorUpdateTemplateEntry -> Bool
(DescriptorUpdateTemplateEntry
 -> DescriptorUpdateTemplateEntry -> Bool)
-> (DescriptorUpdateTemplateEntry
    -> DescriptorUpdateTemplateEntry -> Bool)
-> Eq DescriptorUpdateTemplateEntry
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DescriptorUpdateTemplateEntry
-> DescriptorUpdateTemplateEntry -> Bool
$c/= :: DescriptorUpdateTemplateEntry
-> DescriptorUpdateTemplateEntry -> Bool
== :: DescriptorUpdateTemplateEntry
-> DescriptorUpdateTemplateEntry -> Bool
$c== :: DescriptorUpdateTemplateEntry
-> DescriptorUpdateTemplateEntry -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (DescriptorUpdateTemplateEntry)
#endif
deriving instance Show DescriptorUpdateTemplateEntry

instance ToCStruct DescriptorUpdateTemplateEntry where
  withCStruct :: forall b.
DescriptorUpdateTemplateEntry
-> (Ptr DescriptorUpdateTemplateEntry -> IO b) -> IO b
withCStruct DescriptorUpdateTemplateEntry
x Ptr DescriptorUpdateTemplateEntry -> IO b
f = Int -> (Ptr DescriptorUpdateTemplateEntry -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
32 ((Ptr DescriptorUpdateTemplateEntry -> IO b) -> IO b)
-> (Ptr DescriptorUpdateTemplateEntry -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr DescriptorUpdateTemplateEntry
p -> Ptr DescriptorUpdateTemplateEntry
-> DescriptorUpdateTemplateEntry -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr DescriptorUpdateTemplateEntry
p DescriptorUpdateTemplateEntry
x (Ptr DescriptorUpdateTemplateEntry -> IO b
f Ptr DescriptorUpdateTemplateEntry
p)
  pokeCStruct :: forall b.
Ptr DescriptorUpdateTemplateEntry
-> DescriptorUpdateTemplateEntry -> IO b -> IO b
pokeCStruct Ptr DescriptorUpdateTemplateEntry
p DescriptorUpdateTemplateEntry{Word32
Word64
DescriptorType
stride :: Word64
offset :: Word64
descriptorType :: DescriptorType
descriptorCount :: Word32
dstArrayElement :: Word32
dstBinding :: Word32
$sel:stride:DescriptorUpdateTemplateEntry :: DescriptorUpdateTemplateEntry -> Word64
$sel:offset:DescriptorUpdateTemplateEntry :: DescriptorUpdateTemplateEntry -> Word64
$sel:descriptorType:DescriptorUpdateTemplateEntry :: DescriptorUpdateTemplateEntry -> DescriptorType
$sel:descriptorCount:DescriptorUpdateTemplateEntry :: DescriptorUpdateTemplateEntry -> Word32
$sel:dstArrayElement:DescriptorUpdateTemplateEntry :: DescriptorUpdateTemplateEntry -> Word32
$sel:dstBinding:DescriptorUpdateTemplateEntry :: DescriptorUpdateTemplateEntry -> Word32
..} IO b
f = do
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr Word32)) (Word32
dstBinding)
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4 :: Ptr Word32)) (Word32
dstArrayElement)
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr Word32)) (Word32
descriptorCount)
    Ptr DescriptorType -> DescriptorType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr DescriptorType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
12 :: Ptr DescriptorType)) (DescriptorType
descriptorType)
    Ptr CSize -> CSize -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr CSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr CSize)) (Word64 -> CSize
CSize (Word64
offset))
    Ptr CSize -> CSize -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr CSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr CSize)) (Word64 -> CSize
CSize (Word64
stride))
    IO b
f
  cStructSize :: Int
cStructSize = Int
32
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b. Ptr DescriptorUpdateTemplateEntry -> IO b -> IO b
pokeZeroCStruct Ptr DescriptorUpdateTemplateEntry
p IO b
f = do
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr Word32)) (Word32
forall a. Zero a => a
zero)
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4 :: Ptr Word32)) (Word32
forall a. Zero a => a
zero)
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr Word32)) (Word32
forall a. Zero a => a
zero)
    Ptr DescriptorType -> DescriptorType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr DescriptorType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
12 :: Ptr DescriptorType)) (DescriptorType
forall a. Zero a => a
zero)
    Ptr CSize -> CSize -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr CSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr CSize)) (Word64 -> CSize
CSize (Word64
forall a. Zero a => a
zero))
    Ptr CSize -> CSize -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr CSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr CSize)) (Word64 -> CSize
CSize (Word64
forall a. Zero a => a
zero))
    IO b
f

instance FromCStruct DescriptorUpdateTemplateEntry where
  peekCStruct :: Ptr DescriptorUpdateTemplateEntry
-> IO DescriptorUpdateTemplateEntry
peekCStruct Ptr DescriptorUpdateTemplateEntry
p = do
    Word32
dstBinding <- forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr Word32))
    Word32
dstArrayElement <- forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4 :: Ptr Word32))
    Word32
descriptorCount <- forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr Word32))
    DescriptorType
descriptorType <- forall a. Storable a => Ptr a -> IO a
peek @DescriptorType ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr DescriptorType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
12 :: Ptr DescriptorType))
    CSize
offset <- forall a. Storable a => Ptr a -> IO a
peek @CSize ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr CSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr CSize))
    CSize
stride <- forall a. Storable a => Ptr a -> IO a
peek @CSize ((Ptr DescriptorUpdateTemplateEntry
p Ptr DescriptorUpdateTemplateEntry -> Int -> Ptr CSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr CSize))
    DescriptorUpdateTemplateEntry -> IO DescriptorUpdateTemplateEntry
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DescriptorUpdateTemplateEntry -> IO DescriptorUpdateTemplateEntry)
-> DescriptorUpdateTemplateEntry
-> IO DescriptorUpdateTemplateEntry
forall a b. (a -> b) -> a -> b
$ Word32
-> Word32
-> Word32
-> DescriptorType
-> Word64
-> Word64
-> DescriptorUpdateTemplateEntry
DescriptorUpdateTemplateEntry
             Word32
dstBinding
             Word32
dstArrayElement
             Word32
descriptorCount
             DescriptorType
descriptorType
             (forall a b. Coercible a b => a -> b
coerce @CSize @Word64 CSize
offset)
             (forall a b. Coercible a b => a -> b
coerce @CSize @Word64 CSize
stride)

instance Storable DescriptorUpdateTemplateEntry where
  sizeOf :: DescriptorUpdateTemplateEntry -> Int
sizeOf ~DescriptorUpdateTemplateEntry
_ = Int
32
  alignment :: DescriptorUpdateTemplateEntry -> Int
alignment ~DescriptorUpdateTemplateEntry
_ = Int
8
  peek :: Ptr DescriptorUpdateTemplateEntry
-> IO DescriptorUpdateTemplateEntry
peek = Ptr DescriptorUpdateTemplateEntry
-> IO DescriptorUpdateTemplateEntry
forall a. FromCStruct a => Ptr a -> IO a
peekCStruct
  poke :: Ptr DescriptorUpdateTemplateEntry
-> DescriptorUpdateTemplateEntry -> IO ()
poke Ptr DescriptorUpdateTemplateEntry
ptr DescriptorUpdateTemplateEntry
poked = Ptr DescriptorUpdateTemplateEntry
-> DescriptorUpdateTemplateEntry -> IO () -> IO ()
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr DescriptorUpdateTemplateEntry
ptr DescriptorUpdateTemplateEntry
poked (() -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())

instance Zero DescriptorUpdateTemplateEntry where
  zero :: DescriptorUpdateTemplateEntry
zero = Word32
-> Word32
-> Word32
-> DescriptorType
-> Word64
-> Word64
-> DescriptorUpdateTemplateEntry
DescriptorUpdateTemplateEntry
           Word32
forall a. Zero a => a
zero
           Word32
forall a. Zero a => a
zero
           Word32
forall a. Zero a => a
zero
           DescriptorType
forall a. Zero a => a
zero
           Word64
forall a. Zero a => a
zero
           Word64
forall a. Zero a => a
zero


-- | VkDescriptorUpdateTemplateCreateInfo - Structure specifying parameters
-- of a newly created descriptor update template
--
-- == Valid Usage
--
-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350# If
--     @templateType@ is
--     'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET',
--     @descriptorSetLayout@ /must/ be a valid
--     'Vulkan.Core10.Handles.DescriptorSetLayout' handle
--
-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351# If
--     @templateType@ is
--     'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR',
--     @pipelineBindPoint@ /must/ be a valid
--     'Vulkan.Core10.Enums.PipelineBindPoint.PipelineBindPoint' value
--
-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352# If
--     @templateType@ is
--     'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR',
--     @pipelineLayout@ /must/ be a valid
--     'Vulkan.Core10.Handles.PipelineLayout' handle
--
-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353# If
--     @templateType@ is
--     'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR',
--     @set@ /must/ be the unique set number in the pipeline layout that
--     uses a descriptor set layout that was created with
--     'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR'
--
-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-04615# If
--     @templateType@ is
--     'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET',
--     @descriptorSetLayout@ /must/ not contain a binding with type
--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_EXT'
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-sType-sType# @sType@
--     /must/ be
--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO'
--
-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-pNext-pNext# @pNext@
--     /must/ be @NULL@
--
-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-flags-zerobitmask#
--     @flags@ /must/ be @0@
--
-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-pDescriptorUpdateEntries-parameter#
--     @pDescriptorUpdateEntries@ /must/ be a valid pointer to an array of
--     @descriptorUpdateEntryCount@ valid 'DescriptorUpdateTemplateEntry'
--     structures
--
-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-parameter#
--     @templateType@ /must/ be a valid
--     'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DescriptorUpdateTemplateType'
--     value
--
-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorUpdateEntryCount-arraylength#
--     @descriptorUpdateEntryCount@ /must/ be greater than @0@
--
-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-commonparent# Both of
--     @descriptorSetLayout@, and @pipelineLayout@ that are valid handles
--     of non-ignored parameters /must/ have been created, allocated, or
--     retrieved from the same 'Vulkan.Core10.Handles.Device'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core10.Handles.DescriptorSetLayout',
-- 'Vulkan.Core11.Enums.DescriptorUpdateTemplateCreateFlags.DescriptorUpdateTemplateCreateFlags',
-- 'DescriptorUpdateTemplateEntry',
-- 'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DescriptorUpdateTemplateType',
-- 'Vulkan.Core10.Enums.PipelineBindPoint.PipelineBindPoint',
-- 'Vulkan.Core10.Handles.PipelineLayout',
-- 'Vulkan.Core10.Enums.StructureType.StructureType',
-- 'createDescriptorUpdateTemplate',
-- 'Vulkan.Extensions.VK_KHR_descriptor_update_template.createDescriptorUpdateTemplateKHR'
data DescriptorUpdateTemplateCreateInfo = DescriptorUpdateTemplateCreateInfo
  { -- | @flags@ is reserved for future use.
    DescriptorUpdateTemplateCreateInfo
-> DescriptorUpdateTemplateCreateFlags
flags :: DescriptorUpdateTemplateCreateFlags
  , -- | @pDescriptorUpdateEntries@ is a pointer to an array of
    -- 'DescriptorUpdateTemplateEntry' structures describing the descriptors to
    -- be updated by the descriptor update template.
    DescriptorUpdateTemplateCreateInfo
-> Vector DescriptorUpdateTemplateEntry
descriptorUpdateEntries :: Vector DescriptorUpdateTemplateEntry
  , -- | @templateType@ Specifies the type of the descriptor update template. If
    -- set to
    -- 'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET'
    -- it /can/ only be used to update descriptor sets with a fixed
    -- @descriptorSetLayout@. If set to
    -- 'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR'
    -- it /can/ only be used to push descriptor sets using the provided
    -- @pipelineBindPoint@, @pipelineLayout@, and @set@ number.
    DescriptorUpdateTemplateCreateInfo -> DescriptorUpdateTemplateType
templateType :: DescriptorUpdateTemplateType
  , -- | @descriptorSetLayout@ is the descriptor set layout used to build the
    -- descriptor update template. All descriptor sets which are going to be
    -- updated through the newly created descriptor update template /must/ be
    -- created with a layout that matches (is the same as, or defined
    -- identically to) this layout. This parameter is ignored if @templateType@
    -- is not
    -- 'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET'.
    DescriptorUpdateTemplateCreateInfo -> DescriptorSetLayout
descriptorSetLayout :: DescriptorSetLayout
  , -- | @pipelineBindPoint@ is a
    -- 'Vulkan.Core10.Enums.PipelineBindPoint.PipelineBindPoint' indicating the
    -- type of the pipeline that will use the descriptors. This parameter is
    -- ignored if @templateType@ is not
    -- 'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR'
    DescriptorUpdateTemplateCreateInfo -> PipelineBindPoint
pipelineBindPoint :: PipelineBindPoint
  , -- | @pipelineLayout@ is a 'Vulkan.Core10.Handles.PipelineLayout' object used
    -- to program the bindings. This parameter is ignored if @templateType@ is
    -- not
    -- 'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR'
    DescriptorUpdateTemplateCreateInfo -> PipelineLayout
pipelineLayout :: PipelineLayout
  , -- | @set@ is the set number of the descriptor set in the pipeline layout
    -- that will be updated. This parameter is ignored if @templateType@ is not
    -- 'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR'
    DescriptorUpdateTemplateCreateInfo -> Word32
set :: Word32
  }
  deriving (Typeable)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (DescriptorUpdateTemplateCreateInfo)
#endif
deriving instance Show DescriptorUpdateTemplateCreateInfo

instance ToCStruct DescriptorUpdateTemplateCreateInfo where
  withCStruct :: forall b.
DescriptorUpdateTemplateCreateInfo
-> (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
    -> IO b)
-> IO b
withCStruct DescriptorUpdateTemplateCreateInfo
x ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo) -> IO b
f = Int
-> (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
    -> IO b)
-> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
72 ((("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
  -> IO b)
 -> IO b)
-> (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
    -> IO b)
-> IO b
forall a b. (a -> b) -> a -> b
$ \"pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p -> ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> DescriptorUpdateTemplateCreateInfo -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct "pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p DescriptorUpdateTemplateCreateInfo
x (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo) -> IO b
f "pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p)
  pokeCStruct :: forall b.
("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> DescriptorUpdateTemplateCreateInfo -> IO b -> IO b
pokeCStruct "pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p DescriptorUpdateTemplateCreateInfo{Word32
Vector DescriptorUpdateTemplateEntry
PipelineBindPoint
PipelineLayout
DescriptorSetLayout
DescriptorUpdateTemplateType
DescriptorUpdateTemplateCreateFlags
set :: Word32
pipelineLayout :: PipelineLayout
pipelineBindPoint :: PipelineBindPoint
descriptorSetLayout :: DescriptorSetLayout
templateType :: DescriptorUpdateTemplateType
descriptorUpdateEntries :: Vector DescriptorUpdateTemplateEntry
flags :: DescriptorUpdateTemplateCreateFlags
$sel:set:DescriptorUpdateTemplateCreateInfo :: DescriptorUpdateTemplateCreateInfo -> Word32
$sel:pipelineLayout:DescriptorUpdateTemplateCreateInfo :: DescriptorUpdateTemplateCreateInfo -> PipelineLayout
$sel:pipelineBindPoint:DescriptorUpdateTemplateCreateInfo :: DescriptorUpdateTemplateCreateInfo -> PipelineBindPoint
$sel:descriptorSetLayout:DescriptorUpdateTemplateCreateInfo :: DescriptorUpdateTemplateCreateInfo -> DescriptorSetLayout
$sel:templateType:DescriptorUpdateTemplateCreateInfo :: DescriptorUpdateTemplateCreateInfo -> DescriptorUpdateTemplateType
$sel:descriptorUpdateEntries:DescriptorUpdateTemplateCreateInfo :: DescriptorUpdateTemplateCreateInfo
-> Vector DescriptorUpdateTemplateEntry
$sel:flags:DescriptorUpdateTemplateCreateInfo :: DescriptorUpdateTemplateCreateInfo
-> DescriptorUpdateTemplateCreateFlags
..} IO b
f = ContT b IO b -> IO b
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT b IO b -> IO b) -> ContT b IO b -> IO b
forall a b. (a -> b) -> a -> b
$ do
    IO () -> ContT b IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO)
    IO () -> ContT b IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr ("data" ::: Ptr ()) -> ("data" ::: Ptr ()) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr ("data" ::: Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) ("data" ::: Ptr ()
forall a. Ptr a
nullPtr)
    IO () -> ContT b IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr DescriptorUpdateTemplateCreateFlags
-> DescriptorUpdateTemplateCreateFlags -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr DescriptorUpdateTemplateCreateFlags
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr DescriptorUpdateTemplateCreateFlags)) (DescriptorUpdateTemplateCreateFlags
flags)
    IO () -> ContT b IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
20 :: Ptr Word32)) ((Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Vector DescriptorUpdateTemplateEntry -> Int
forall a. Vector a -> Int
Data.Vector.length (Vector DescriptorUpdateTemplateEntry -> Int)
-> Vector DescriptorUpdateTemplateEntry -> Int
forall a b. (a -> b) -> a -> b
$ (Vector DescriptorUpdateTemplateEntry
descriptorUpdateEntries)) :: Word32))
    Ptr DescriptorUpdateTemplateEntry
pPDescriptorUpdateEntries' <- ((Ptr DescriptorUpdateTemplateEntry -> IO b) -> IO b)
-> ContT b IO (Ptr DescriptorUpdateTemplateEntry)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr DescriptorUpdateTemplateEntry -> IO b) -> IO b)
 -> ContT b IO (Ptr DescriptorUpdateTemplateEntry))
-> ((Ptr DescriptorUpdateTemplateEntry -> IO b) -> IO b)
-> ContT b IO (Ptr DescriptorUpdateTemplateEntry)
forall a b. (a -> b) -> a -> b
$ forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes @DescriptorUpdateTemplateEntry ((Vector DescriptorUpdateTemplateEntry -> Int
forall a. Vector a -> Int
Data.Vector.length (Vector DescriptorUpdateTemplateEntry
descriptorUpdateEntries)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
32)
    IO () -> ContT b IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ (Int -> DescriptorUpdateTemplateEntry -> IO ())
-> Vector DescriptorUpdateTemplateEntry -> IO ()
forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\Int
i DescriptorUpdateTemplateEntry
e -> Ptr DescriptorUpdateTemplateEntry
-> DescriptorUpdateTemplateEntry -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr DescriptorUpdateTemplateEntry
pPDescriptorUpdateEntries' Ptr DescriptorUpdateTemplateEntry
-> Int -> Ptr DescriptorUpdateTemplateEntry
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
32 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr DescriptorUpdateTemplateEntry) (DescriptorUpdateTemplateEntry
e)) (Vector DescriptorUpdateTemplateEntry
descriptorUpdateEntries)
    IO () -> ContT b IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr (Ptr DescriptorUpdateTemplateEntry)
-> Ptr DescriptorUpdateTemplateEntry -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr (Ptr DescriptorUpdateTemplateEntry)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr (Ptr DescriptorUpdateTemplateEntry))) (Ptr DescriptorUpdateTemplateEntry
pPDescriptorUpdateEntries')
    IO () -> ContT b IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr DescriptorUpdateTemplateType
-> DescriptorUpdateTemplateType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr DescriptorUpdateTemplateType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
32 :: Ptr DescriptorUpdateTemplateType)) (DescriptorUpdateTemplateType
templateType)
    IO () -> ContT b IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr DescriptorSetLayout -> DescriptorSetLayout -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr DescriptorSetLayout
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
40 :: Ptr DescriptorSetLayout)) (DescriptorSetLayout
descriptorSetLayout)
    IO () -> ContT b IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr PipelineBindPoint -> PipelineBindPoint -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr PipelineBindPoint
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
48 :: Ptr PipelineBindPoint)) (PipelineBindPoint
pipelineBindPoint)
    IO () -> ContT b IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr PipelineLayout -> PipelineLayout -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr PipelineLayout
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
56 :: Ptr PipelineLayout)) (PipelineLayout
pipelineLayout)
    IO () -> ContT b IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
64 :: Ptr Word32)) (Word32
set)
    IO b -> ContT b IO b
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO b -> ContT b IO b) -> IO b -> ContT b IO b
forall a b. (a -> b) -> a -> b
$ IO b
f
  cStructSize :: Int
cStructSize = Int
72
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b.
("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> IO b -> IO b
pokeZeroCStruct "pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO)
    Ptr ("data" ::: Ptr ()) -> ("data" ::: Ptr ()) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr ("data" ::: Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) ("data" ::: Ptr ()
forall a. Ptr a
nullPtr)
    Ptr DescriptorUpdateTemplateType
-> DescriptorUpdateTemplateType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr DescriptorUpdateTemplateType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
32 :: Ptr DescriptorUpdateTemplateType)) (DescriptorUpdateTemplateType
forall a. Zero a => a
zero)
    Ptr DescriptorSetLayout -> DescriptorSetLayout -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr DescriptorSetLayout
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
40 :: Ptr DescriptorSetLayout)) (DescriptorSetLayout
forall a. Zero a => a
zero)
    Ptr PipelineBindPoint -> PipelineBindPoint -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr PipelineBindPoint
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
48 :: Ptr PipelineBindPoint)) (PipelineBindPoint
forall a. Zero a => a
zero)
    Ptr PipelineLayout -> PipelineLayout -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr PipelineLayout
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
56 :: Ptr PipelineLayout)) (PipelineLayout
forall a. Zero a => a
zero)
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
64 :: Ptr Word32)) (Word32
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct DescriptorUpdateTemplateCreateInfo where
  peekCStruct :: ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> IO DescriptorUpdateTemplateCreateInfo
peekCStruct "pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p = do
    DescriptorUpdateTemplateCreateFlags
flags <- forall a. Storable a => Ptr a -> IO a
peek @DescriptorUpdateTemplateCreateFlags (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr DescriptorUpdateTemplateCreateFlags
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr DescriptorUpdateTemplateCreateFlags))
    Word32
descriptorUpdateEntryCount <- forall a. Storable a => Ptr a -> IO a
peek @Word32 (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
20 :: Ptr Word32))
    Ptr DescriptorUpdateTemplateEntry
pDescriptorUpdateEntries <- forall a. Storable a => Ptr a -> IO a
peek @(Ptr DescriptorUpdateTemplateEntry) (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr (Ptr DescriptorUpdateTemplateEntry)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr (Ptr DescriptorUpdateTemplateEntry)))
    Vector DescriptorUpdateTemplateEntry
pDescriptorUpdateEntries' <- Int
-> (Int -> IO DescriptorUpdateTemplateEntry)
-> IO (Vector DescriptorUpdateTemplateEntry)
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> m a) -> m (Vector a)
generateM (Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
descriptorUpdateEntryCount) (\Int
i -> forall a. FromCStruct a => Ptr a -> IO a
peekCStruct @DescriptorUpdateTemplateEntry ((Ptr DescriptorUpdateTemplateEntry
pDescriptorUpdateEntries Ptr DescriptorUpdateTemplateEntry
-> Int -> Ptr DescriptorUpdateTemplateEntry
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (Int
32 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr DescriptorUpdateTemplateEntry)))
    DescriptorUpdateTemplateType
templateType <- forall a. Storable a => Ptr a -> IO a
peek @DescriptorUpdateTemplateType (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr DescriptorUpdateTemplateType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
32 :: Ptr DescriptorUpdateTemplateType))
    DescriptorSetLayout
descriptorSetLayout <- forall a. Storable a => Ptr a -> IO a
peek @DescriptorSetLayout (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr DescriptorSetLayout
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
40 :: Ptr DescriptorSetLayout))
    PipelineBindPoint
pipelineBindPoint <- forall a. Storable a => Ptr a -> IO a
peek @PipelineBindPoint (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr PipelineBindPoint
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
48 :: Ptr PipelineBindPoint))
    PipelineLayout
pipelineLayout <- forall a. Storable a => Ptr a -> IO a
peek @PipelineLayout (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr PipelineLayout
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
56 :: Ptr PipelineLayout))
    Word32
set <- forall a. Storable a => Ptr a -> IO a
peek @Word32 (("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo
p ("pCreateInfo" ::: Ptr DescriptorUpdateTemplateCreateInfo)
-> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
64 :: Ptr Word32))
    DescriptorUpdateTemplateCreateInfo
-> IO DescriptorUpdateTemplateCreateInfo
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DescriptorUpdateTemplateCreateInfo
 -> IO DescriptorUpdateTemplateCreateInfo)
-> DescriptorUpdateTemplateCreateInfo
-> IO DescriptorUpdateTemplateCreateInfo
forall a b. (a -> b) -> a -> b
$ DescriptorUpdateTemplateCreateFlags
-> Vector DescriptorUpdateTemplateEntry
-> DescriptorUpdateTemplateType
-> DescriptorSetLayout
-> PipelineBindPoint
-> PipelineLayout
-> Word32
-> DescriptorUpdateTemplateCreateInfo
DescriptorUpdateTemplateCreateInfo
             DescriptorUpdateTemplateCreateFlags
flags
             Vector DescriptorUpdateTemplateEntry
pDescriptorUpdateEntries'
             DescriptorUpdateTemplateType
templateType
             DescriptorSetLayout
descriptorSetLayout
             PipelineBindPoint
pipelineBindPoint
             PipelineLayout
pipelineLayout
             Word32
set

instance Zero DescriptorUpdateTemplateCreateInfo where
  zero :: DescriptorUpdateTemplateCreateInfo
zero = DescriptorUpdateTemplateCreateFlags
-> Vector DescriptorUpdateTemplateEntry
-> DescriptorUpdateTemplateType
-> DescriptorSetLayout
-> PipelineBindPoint
-> PipelineLayout
-> Word32
-> DescriptorUpdateTemplateCreateInfo
DescriptorUpdateTemplateCreateInfo
           DescriptorUpdateTemplateCreateFlags
forall a. Zero a => a
zero
           Vector DescriptorUpdateTemplateEntry
forall a. Monoid a => a
mempty
           DescriptorUpdateTemplateType
forall a. Zero a => a
zero
           DescriptorSetLayout
forall a. Zero a => a
zero
           PipelineBindPoint
forall a. Zero a => a
zero
           PipelineLayout
forall a. Zero a => a
zero
           Word32
forall a. Zero a => a
zero