{-# language CPP #-}
module Vulkan.Core10.MemoryManagement  ( getBufferMemoryRequirements
                                       , bindBufferMemory
                                       , getImageMemoryRequirements
                                       , bindImageMemory
                                       , MemoryRequirements(..)
                                       , DeviceMemory(..)
                                       ) where

import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Foreign.Marshal.Alloc (allocaBytesAligned)
import GHC.Base (when)
import GHC.IO (throwIO)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (plusPtr)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (evalContT)
import Control.Monad.IO.Class (MonadIO)
import Data.Typeable (Typeable)
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.Kind (Type)
import Control.Monad.Trans.Cont (ContT(..))
import Vulkan.NamedType ((:::))
import Vulkan.Core10.Handles (Buffer)
import Vulkan.Core10.Handles (Buffer(..))
import Vulkan.Core10.Handles (Device)
import Vulkan.Core10.Handles (Device(..))
import Vulkan.Dynamic (DeviceCmds(pVkBindBufferMemory))
import Vulkan.Dynamic (DeviceCmds(pVkBindImageMemory))
import Vulkan.Dynamic (DeviceCmds(pVkGetBufferMemoryRequirements))
import Vulkan.Dynamic (DeviceCmds(pVkGetImageMemoryRequirements))
import Vulkan.Core10.Handles (DeviceMemory)
import Vulkan.Core10.Handles (DeviceMemory(..))
import Vulkan.Core10.FundamentalTypes (DeviceSize)
import Vulkan.Core10.Handles (Device_T)
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.Core10.Handles (Image)
import Vulkan.Core10.Handles (Image(..))
import Vulkan.Core10.Enums.Result (Result)
import Vulkan.Core10.Enums.Result (Result(..))
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Exception (VulkanException(..))
import Vulkan.Zero (Zero(..))
import Vulkan.Core10.Enums.Result (Result(SUCCESS))
import Vulkan.Core10.Handles (DeviceMemory(..))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkGetBufferMemoryRequirements
  :: FunPtr (Ptr Device_T -> Buffer -> Ptr MemoryRequirements -> IO ()) -> Ptr Device_T -> Buffer -> Ptr MemoryRequirements -> IO ()

-- | vkGetBufferMemoryRequirements - Returns the memory requirements for
-- specified Vulkan object
--
-- == Valid Usage
--
-- -   If @buffer@ was created with the
--     'Vulkan.Core11.Enums.ExternalMemoryHandleTypeFlagBits.EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID'
--     external memory handle type, then @buffer@ /must/ be bound to memory
--
-- == Valid Usage (Implicit)
--
-- -   @device@ /must/ be a valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   @buffer@ /must/ be a valid 'Vulkan.Core10.Handles.Buffer' handle
--
-- -   @pMemoryRequirements@ /must/ be a valid pointer to a
--     'MemoryRequirements' structure
--
-- -   @buffer@ /must/ have been created, allocated, or retrieved from
--     @device@
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.Buffer', 'Vulkan.Core10.Handles.Device',
-- 'MemoryRequirements'
getBufferMemoryRequirements :: forall io
                             . (MonadIO io)
                            => -- | @device@ is the logical device that owns the buffer.
                               Device
                            -> -- | @buffer@ is the buffer to query.
                               Buffer
                            -> io (MemoryRequirements)
getBufferMemoryRequirements :: Device -> Buffer -> io MemoryRequirements
getBufferMemoryRequirements device :: Device
device buffer :: Buffer
buffer = IO MemoryRequirements -> io MemoryRequirements
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO MemoryRequirements -> io MemoryRequirements)
-> (ContT MemoryRequirements IO MemoryRequirements
    -> IO MemoryRequirements)
-> ContT MemoryRequirements IO MemoryRequirements
-> io MemoryRequirements
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT MemoryRequirements IO MemoryRequirements
-> IO MemoryRequirements
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT MemoryRequirements IO MemoryRequirements
 -> io MemoryRequirements)
-> ContT MemoryRequirements IO MemoryRequirements
-> io MemoryRequirements
forall a b. (a -> b) -> a -> b
$ do
  let vkGetBufferMemoryRequirementsPtr :: FunPtr
  (Ptr Device_T
   -> Buffer
   -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
   -> IO ())
vkGetBufferMemoryRequirementsPtr = DeviceCmds
-> FunPtr
     (Ptr Device_T
      -> Buffer
      -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
      -> IO ())
pVkGetBufferMemoryRequirements (Device -> DeviceCmds
deviceCmds (Device
device :: Device))
  IO () -> ContT MemoryRequirements IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT MemoryRequirements IO ())
-> IO () -> ContT MemoryRequirements IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T
   -> Buffer
   -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
   -> IO ())
vkGetBufferMemoryRequirementsPtr FunPtr
  (Ptr Device_T
   -> Buffer
   -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
   -> IO ())
-> FunPtr
     (Ptr Device_T
      -> Buffer
      -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr Device_T
   -> Buffer
   -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
   -> 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 "" "The function pointer for vkGetBufferMemoryRequirements is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkGetBufferMemoryRequirements' :: Ptr Device_T
-> Buffer
-> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> IO ()
vkGetBufferMemoryRequirements' = FunPtr
  (Ptr Device_T
   -> Buffer
   -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
   -> IO ())
-> Ptr Device_T
-> Buffer
-> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> IO ()
mkVkGetBufferMemoryRequirements FunPtr
  (Ptr Device_T
   -> Buffer
   -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
   -> IO ())
vkGetBufferMemoryRequirementsPtr
  "pMemoryRequirements" ::: Ptr MemoryRequirements
pPMemoryRequirements <- ((("pMemoryRequirements" ::: Ptr MemoryRequirements)
  -> IO MemoryRequirements)
 -> IO MemoryRequirements)
-> ContT
     MemoryRequirements
     IO
     ("pMemoryRequirements" ::: Ptr MemoryRequirements)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (forall b.
ToCStruct MemoryRequirements =>
(("pMemoryRequirements" ::: Ptr MemoryRequirements) -> IO b)
-> IO b
forall a b. ToCStruct a => (Ptr a -> IO b) -> IO b
withZeroCStruct @MemoryRequirements)
  IO () -> ContT MemoryRequirements IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT MemoryRequirements IO ())
-> IO () -> ContT MemoryRequirements IO ()
forall a b. (a -> b) -> a -> b
$ Ptr Device_T
-> Buffer
-> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> IO ()
vkGetBufferMemoryRequirements' (Device -> Ptr Device_T
deviceHandle (Device
device)) (Buffer
buffer) ("pMemoryRequirements" ::: Ptr MemoryRequirements
pPMemoryRequirements)
  MemoryRequirements
pMemoryRequirements <- IO MemoryRequirements
-> ContT MemoryRequirements IO MemoryRequirements
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO MemoryRequirements
 -> ContT MemoryRequirements IO MemoryRequirements)
-> IO MemoryRequirements
-> ContT MemoryRequirements IO MemoryRequirements
forall a b. (a -> b) -> a -> b
$ ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> IO MemoryRequirements
forall a. FromCStruct a => Ptr a -> IO a
peekCStruct @MemoryRequirements "pMemoryRequirements" ::: Ptr MemoryRequirements
pPMemoryRequirements
  MemoryRequirements
-> ContT MemoryRequirements IO MemoryRequirements
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MemoryRequirements
 -> ContT MemoryRequirements IO MemoryRequirements)
-> MemoryRequirements
-> ContT MemoryRequirements IO MemoryRequirements
forall a b. (a -> b) -> a -> b
$ (MemoryRequirements
pMemoryRequirements)


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkBindBufferMemory
  :: FunPtr (Ptr Device_T -> Buffer -> DeviceMemory -> DeviceSize -> IO Result) -> Ptr Device_T -> Buffer -> DeviceMemory -> DeviceSize -> IO Result

-- | vkBindBufferMemory - Bind device memory to a buffer object
--
-- = Description
--
-- 'bindBufferMemory' is equivalent to passing the same parameters through
-- 'Vulkan.Core11.Promoted_From_VK_KHR_bind_memory2.BindBufferMemoryInfo'
-- to 'Vulkan.Core11.Promoted_From_VK_KHR_bind_memory2.bindBufferMemory2'.
--
-- == Valid Usage
--
-- -   @buffer@ /must/ not already be backed by a memory object
--
-- -   @buffer@ /must/ not have been created with any sparse memory binding
--     flags
--
-- -   @memoryOffset@ /must/ be less than the size of @memory@
--
-- -   @memory@ /must/ have been allocated using one of the memory types
--     allowed in the @memoryTypeBits@ member of the 'MemoryRequirements'
--     structure returned from a call to 'getBufferMemoryRequirements' with
--     @buffer@
--
-- -   @memoryOffset@ /must/ be an integer multiple of the @alignment@
--     member of the 'MemoryRequirements' structure returned from a call to
--     'getBufferMemoryRequirements' with @buffer@
--
-- -   The @size@ member of the 'MemoryRequirements' structure returned
--     from a call to 'getBufferMemoryRequirements' with @buffer@ /must/ be
--     less than or equal to the size of @memory@ minus @memoryOffset@
--
-- -   If @buffer@ requires a dedicated allocation(as reported by
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_memory_requirements2.getBufferMemoryRequirements2'
--     in
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedRequirements'::requiresDedicatedAllocation
--     for @buffer@), @memory@ /must/ have been created with
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedAllocateInfo'::@buffer@
--     equal to @buffer@
--
-- -   If the 'Vulkan.Core10.Memory.MemoryAllocateInfo' provided when
--     @memory@ was allocated included a
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedAllocateInfo'
--     structure in its @pNext@ chain, and
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedAllocateInfo'::@buffer@
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', then @buffer@
--     /must/ equal
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedAllocateInfo'::@buffer@,
--     and @memoryOffset@ /must/ be zero
--
-- -   If buffer was created with the
--     'Vulkan.Core10.Enums.BufferCreateFlagBits.BUFFER_CREATE_PROTECTED_BIT'
--     bit set, the buffer /must/ be bound to a memory object allocated
--     with a memory type that reports
--     'Vulkan.Core10.Enums.MemoryPropertyFlagBits.MEMORY_PROPERTY_PROTECTED_BIT'
--
-- -   If buffer was created with the
--     'Vulkan.Core10.Enums.BufferCreateFlagBits.BUFFER_CREATE_PROTECTED_BIT'
--     bit not set, the buffer /must/ not be bound to a memory object
--     created with a memory type that reports
--     'Vulkan.Core10.Enums.MemoryPropertyFlagBits.MEMORY_PROPERTY_PROTECTED_BIT'
--
-- -   If @buffer@ was created with
--     'Vulkan.Extensions.VK_NV_dedicated_allocation.DedicatedAllocationBufferCreateInfoNV'::@dedicatedAllocation@
--     equal to 'Vulkan.Core10.FundamentalTypes.TRUE', @memory@ /must/ have
--     been created with
--     'Vulkan.Extensions.VK_NV_dedicated_allocation.DedicatedAllocationMemoryAllocateInfoNV'::@buffer@
--     equal to a buffer handle created with identical creation parameters
--     to @buffer@ and @memoryOffset@ /must/ be zero
--
-- -   If the value of
--     'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExportMemoryAllocateInfo'::@handleTypes@
--     used to allocate @memory@ is not @0@, it /must/ include at least one
--     of the handles set in
--     'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryBufferCreateInfo'::@handleTypes@
--     when @buffer@ was created
--
-- -   If @memory@ was created by a memory import operation, that is not
--     'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ImportAndroidHardwareBufferInfoANDROID'
--     with a non-@NULL@ @buffer@ value, the external handle type of the
--     imported memory /must/ also have been set in
--     'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryBufferCreateInfo'::@handleTypes@
--     when @buffer@ was created
--
-- -   If @memory@ was created with the
--     'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ImportAndroidHardwareBufferInfoANDROID'
--     memory import operation with a non-@NULL@ @buffer@ value,
--     'Vulkan.Core11.Enums.ExternalMemoryHandleTypeFlagBits.EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID'
--     /must/ also have been set in
--     'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryBufferCreateInfo'::@handleTypes@
--     when @buffer@ was created
--
-- -   If the
--     'Vulkan.Core12.Promoted_From_VK_KHR_buffer_device_address.PhysicalDeviceBufferDeviceAddressFeatures'::@bufferDeviceAddress@
--     feature is enabled and @buffer@ was created with the
--     'Vulkan.Core10.Enums.BufferUsageFlagBits.BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT'
--     bit set, @memory@ /must/ have been allocated with the
--     'Vulkan.Core11.Enums.MemoryAllocateFlagBits.MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT'
--     bit set
--
-- == Valid Usage (Implicit)
--
-- -   @device@ /must/ be a valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   @buffer@ /must/ be a valid 'Vulkan.Core10.Handles.Buffer' handle
--
-- -   @memory@ /must/ be a valid 'Vulkan.Core10.Handles.DeviceMemory'
--     handle
--
-- -   @buffer@ /must/ have been created, allocated, or retrieved from
--     @device@
--
-- -   @memory@ /must/ have been created, allocated, or retrieved from
--     @device@
--
-- == Host Synchronization
--
-- -   Host access to @buffer@ /must/ be externally synchronized
--
-- == 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'
--
--     -   'Vulkan.Extensions.VK_KHR_buffer_device_address.ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR'
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.Buffer', 'Vulkan.Core10.Handles.Device',
-- 'Vulkan.Core10.Handles.DeviceMemory',
-- 'Vulkan.Core10.FundamentalTypes.DeviceSize'
bindBufferMemory :: forall io
                  . (MonadIO io)
                 => -- | @device@ is the logical device that owns the buffer and memory.
                    Device
                 -> -- | @buffer@ is the buffer to be attached to memory.
                    Buffer
                 -> -- | @memory@ is a 'Vulkan.Core10.Handles.DeviceMemory' object describing the
                    -- device memory to attach.
                    DeviceMemory
                 -> -- | @memoryOffset@ is the start offset of the region of @memory@ which is to
                    -- be bound to the buffer. The number of bytes returned in the
                    -- 'MemoryRequirements'::@size@ member in @memory@, starting from
                    -- @memoryOffset@ bytes, will be bound to the specified buffer.
                    ("memoryOffset" ::: DeviceSize)
                 -> io ()
bindBufferMemory :: Device
-> Buffer
-> DeviceMemory
-> ("memoryOffset" ::: DeviceSize)
-> io ()
bindBufferMemory device :: Device
device buffer :: Buffer
buffer memory :: DeviceMemory
memory memoryOffset :: "memoryOffset" ::: DeviceSize
memoryOffset = 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 vkBindBufferMemoryPtr :: FunPtr
  (Ptr Device_T
   -> Buffer
   -> DeviceMemory
   -> ("memoryOffset" ::: DeviceSize)
   -> IO Result)
vkBindBufferMemoryPtr = DeviceCmds
-> FunPtr
     (Ptr Device_T
      -> Buffer
      -> DeviceMemory
      -> ("memoryOffset" ::: DeviceSize)
      -> IO Result)
pVkBindBufferMemory (Device -> DeviceCmds
deviceCmds (Device
device :: Device))
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T
   -> Buffer
   -> DeviceMemory
   -> ("memoryOffset" ::: DeviceSize)
   -> IO Result)
vkBindBufferMemoryPtr FunPtr
  (Ptr Device_T
   -> Buffer
   -> DeviceMemory
   -> ("memoryOffset" ::: DeviceSize)
   -> IO Result)
-> FunPtr
     (Ptr Device_T
      -> Buffer
      -> DeviceMemory
      -> ("memoryOffset" ::: DeviceSize)
      -> IO Result)
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr Device_T
   -> Buffer
   -> DeviceMemory
   -> ("memoryOffset" ::: DeviceSize)
   -> 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 "" "The function pointer for vkBindBufferMemory is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkBindBufferMemory' :: Ptr Device_T
-> Buffer
-> DeviceMemory
-> ("memoryOffset" ::: DeviceSize)
-> IO Result
vkBindBufferMemory' = FunPtr
  (Ptr Device_T
   -> Buffer
   -> DeviceMemory
   -> ("memoryOffset" ::: DeviceSize)
   -> IO Result)
-> Ptr Device_T
-> Buffer
-> DeviceMemory
-> ("memoryOffset" ::: DeviceSize)
-> IO Result
mkVkBindBufferMemory FunPtr
  (Ptr Device_T
   -> Buffer
   -> DeviceMemory
   -> ("memoryOffset" ::: DeviceSize)
   -> IO Result)
vkBindBufferMemoryPtr
  Result
r <- Ptr Device_T
-> Buffer
-> DeviceMemory
-> ("memoryOffset" ::: DeviceSize)
-> IO Result
vkBindBufferMemory' (Device -> Ptr Device_T
deviceHandle (Device
device)) (Buffer
buffer) (DeviceMemory
memory) ("memoryOffset" ::: DeviceSize
memoryOffset)
  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))


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkGetImageMemoryRequirements
  :: FunPtr (Ptr Device_T -> Image -> Ptr MemoryRequirements -> IO ()) -> Ptr Device_T -> Image -> Ptr MemoryRequirements -> IO ()

-- | vkGetImageMemoryRequirements - Returns the memory requirements for
-- specified Vulkan object
--
-- == Valid Usage
--
-- -   @image@ /must/ not have been created with the
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_DISJOINT_BIT'
--     flag set
--
-- -   If @image@ was created with the
--     'Vulkan.Core11.Enums.ExternalMemoryHandleTypeFlagBits.EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID'
--     external memory handle type, then @image@ /must/ be bound to memory
--
-- == Valid Usage (Implicit)
--
-- -   @device@ /must/ be a valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   @image@ /must/ be a valid 'Vulkan.Core10.Handles.Image' handle
--
-- -   @pMemoryRequirements@ /must/ be a valid pointer to a
--     'MemoryRequirements' structure
--
-- -   @image@ /must/ have been created, allocated, or retrieved from
--     @device@
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.Device', 'Vulkan.Core10.Handles.Image',
-- 'MemoryRequirements'
getImageMemoryRequirements :: forall io
                            . (MonadIO io)
                           => -- | @device@ is the logical device that owns the image.
                              Device
                           -> -- | @image@ is the image to query.
                              Image
                           -> io (MemoryRequirements)
getImageMemoryRequirements :: Device -> Image -> io MemoryRequirements
getImageMemoryRequirements device :: Device
device image :: Image
image = IO MemoryRequirements -> io MemoryRequirements
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO MemoryRequirements -> io MemoryRequirements)
-> (ContT MemoryRequirements IO MemoryRequirements
    -> IO MemoryRequirements)
-> ContT MemoryRequirements IO MemoryRequirements
-> io MemoryRequirements
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT MemoryRequirements IO MemoryRequirements
-> IO MemoryRequirements
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT MemoryRequirements IO MemoryRequirements
 -> io MemoryRequirements)
-> ContT MemoryRequirements IO MemoryRequirements
-> io MemoryRequirements
forall a b. (a -> b) -> a -> b
$ do
  let vkGetImageMemoryRequirementsPtr :: FunPtr
  (Ptr Device_T
   -> Image
   -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
   -> IO ())
vkGetImageMemoryRequirementsPtr = DeviceCmds
-> FunPtr
     (Ptr Device_T
      -> Image
      -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
      -> IO ())
pVkGetImageMemoryRequirements (Device -> DeviceCmds
deviceCmds (Device
device :: Device))
  IO () -> ContT MemoryRequirements IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT MemoryRequirements IO ())
-> IO () -> ContT MemoryRequirements IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T
   -> Image
   -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
   -> IO ())
vkGetImageMemoryRequirementsPtr FunPtr
  (Ptr Device_T
   -> Image
   -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
   -> IO ())
-> FunPtr
     (Ptr Device_T
      -> Image
      -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr Device_T
   -> Image
   -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
   -> 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 "" "The function pointer for vkGetImageMemoryRequirements is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkGetImageMemoryRequirements' :: Ptr Device_T
-> Image
-> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> IO ()
vkGetImageMemoryRequirements' = FunPtr
  (Ptr Device_T
   -> Image
   -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
   -> IO ())
-> Ptr Device_T
-> Image
-> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> IO ()
mkVkGetImageMemoryRequirements FunPtr
  (Ptr Device_T
   -> Image
   -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
   -> IO ())
vkGetImageMemoryRequirementsPtr
  "pMemoryRequirements" ::: Ptr MemoryRequirements
pPMemoryRequirements <- ((("pMemoryRequirements" ::: Ptr MemoryRequirements)
  -> IO MemoryRequirements)
 -> IO MemoryRequirements)
-> ContT
     MemoryRequirements
     IO
     ("pMemoryRequirements" ::: Ptr MemoryRequirements)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (forall b.
ToCStruct MemoryRequirements =>
(("pMemoryRequirements" ::: Ptr MemoryRequirements) -> IO b)
-> IO b
forall a b. ToCStruct a => (Ptr a -> IO b) -> IO b
withZeroCStruct @MemoryRequirements)
  IO () -> ContT MemoryRequirements IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT MemoryRequirements IO ())
-> IO () -> ContT MemoryRequirements IO ()
forall a b. (a -> b) -> a -> b
$ Ptr Device_T
-> Image
-> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> IO ()
vkGetImageMemoryRequirements' (Device -> Ptr Device_T
deviceHandle (Device
device)) (Image
image) ("pMemoryRequirements" ::: Ptr MemoryRequirements
pPMemoryRequirements)
  MemoryRequirements
pMemoryRequirements <- IO MemoryRequirements
-> ContT MemoryRequirements IO MemoryRequirements
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO MemoryRequirements
 -> ContT MemoryRequirements IO MemoryRequirements)
-> IO MemoryRequirements
-> ContT MemoryRequirements IO MemoryRequirements
forall a b. (a -> b) -> a -> b
$ ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> IO MemoryRequirements
forall a. FromCStruct a => Ptr a -> IO a
peekCStruct @MemoryRequirements "pMemoryRequirements" ::: Ptr MemoryRequirements
pPMemoryRequirements
  MemoryRequirements
-> ContT MemoryRequirements IO MemoryRequirements
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MemoryRequirements
 -> ContT MemoryRequirements IO MemoryRequirements)
-> MemoryRequirements
-> ContT MemoryRequirements IO MemoryRequirements
forall a b. (a -> b) -> a -> b
$ (MemoryRequirements
pMemoryRequirements)


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkBindImageMemory
  :: FunPtr (Ptr Device_T -> Image -> DeviceMemory -> DeviceSize -> IO Result) -> Ptr Device_T -> Image -> DeviceMemory -> DeviceSize -> IO Result

-- | vkBindImageMemory - Bind device memory to an image object
--
-- = Description
--
-- 'bindImageMemory' is equivalent to passing the same parameters through
-- 'Vulkan.Core11.Promoted_From_VK_KHR_bind_memory2.BindImageMemoryInfo' to
-- 'Vulkan.Core11.Promoted_From_VK_KHR_bind_memory2.bindImageMemory2'.
--
-- == Valid Usage
--
-- -   @image@ /must/ not have been created with the
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_DISJOINT_BIT'
--     set
--
-- -   @image@ /must/ not already be backed by a memory object
--
-- -   @image@ /must/ not have been created with any sparse memory binding
--     flags
--
-- -   @memoryOffset@ /must/ be less than the size of @memory@
--
-- -   @memory@ /must/ have been allocated using one of the memory types
--     allowed in the @memoryTypeBits@ member of the 'MemoryRequirements'
--     structure returned from a call to 'getImageMemoryRequirements' with
--     @image@
--
-- -   @memoryOffset@ /must/ be an integer multiple of the @alignment@
--     member of the 'MemoryRequirements' structure returned from a call to
--     'getImageMemoryRequirements' with @image@
--
-- -   The difference of the size of @memory@ and @memoryOffset@ /must/ be
--     greater than or equal to the @size@ member of the
--     'MemoryRequirements' structure returned from a call to
--     'getImageMemoryRequirements' with the same @image@
--
-- -   If @image@ requires a dedicated allocation (as reported by
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_memory_requirements2.getImageMemoryRequirements2'
--     in
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedRequirements'::requiresDedicatedAllocation
--     for @image@), @memory@ /must/ have been created with
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedAllocateInfo'::@image@
--     equal to @image@
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-dedicatedAllocationImageAliasing dedicated allocation image aliasing>
--     feature is not enabled, and the
--     'Vulkan.Core10.Memory.MemoryAllocateInfo' provided when @memory@ was
--     allocated included a
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedAllocateInfo'
--     structure in its @pNext@ chain, and
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedAllocateInfo'::@image@
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', then @image@
--     /must/ equal
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedAllocateInfo'::@image@
--     and @memoryOffset@ /must/ be zero
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-dedicatedAllocationImageAliasing dedicated allocation image aliasing>
--     feature is enabled, and the
--     'Vulkan.Core10.Memory.MemoryAllocateInfo' provided when @memory@ was
--     allocated included a
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedAllocateInfo'
--     structure in its @pNext@ chain, and
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedAllocateInfo'::@image@
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', then
--     @memoryOffset@ /must/ be zero, and @image@ /must/ be either equal to
--     'Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation.MemoryDedicatedAllocateInfo'::@image@
--     or an image that was created using the same parameters in
--     'Vulkan.Core10.Image.ImageCreateInfo', with the exception that
--     @extent@ and @arrayLayers@ /may/ differ subject to the following
--     restrictions: every dimension in the @extent@ parameter of the image
--     being bound /must/ be equal to or smaller than the original image
--     for which the allocation was created; and the @arrayLayers@
--     parameter of the image being bound /must/ be equal to or smaller
--     than the original image for which the allocation was created
--
-- -   If image was created with the
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_PROTECTED_BIT'
--     bit set, the image /must/ be bound to a memory object allocated with
--     a memory type that reports
--     'Vulkan.Core10.Enums.MemoryPropertyFlagBits.MEMORY_PROPERTY_PROTECTED_BIT'
--
-- -   If image was created with the
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_PROTECTED_BIT'
--     bit not set, the image /must/ not be bound to a memory object
--     created with a memory type that reports
--     'Vulkan.Core10.Enums.MemoryPropertyFlagBits.MEMORY_PROPERTY_PROTECTED_BIT'
--
-- -   If @image@ was created with
--     'Vulkan.Extensions.VK_NV_dedicated_allocation.DedicatedAllocationImageCreateInfoNV'::@dedicatedAllocation@
--     equal to 'Vulkan.Core10.FundamentalTypes.TRUE', @memory@ /must/ have
--     been created with
--     'Vulkan.Extensions.VK_NV_dedicated_allocation.DedicatedAllocationMemoryAllocateInfoNV'::@image@
--     equal to an image handle created with identical creation parameters
--     to @image@ and @memoryOffset@ /must/ be zero
--
-- -   If the value of
--     'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExportMemoryAllocateInfo'::@handleTypes@
--     used to allocate @memory@ is not @0@, it /must/ include at least one
--     of the handles set in
--     'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo'::@handleTypes@
--     when @image@ was created
--
-- -   If @memory@ was created by a memory import operation, that is not
--     'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ImportAndroidHardwareBufferInfoANDROID'
--     with a non-@NULL@ @buffer@ value, the external handle type of the
--     imported memory /must/ also have been set in
--     'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo'::@handleTypes@
--     when @image@ was created
--
-- -   If @memory@ was created with the
--     'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ImportAndroidHardwareBufferInfoANDROID'
--     memory import operation with a non-@NULL@ @buffer@ value,
--     'Vulkan.Core11.Enums.ExternalMemoryHandleTypeFlagBits.EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID'
--     /must/ also have been set in
--     'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo'::@handleTypes@
--     when @image@ was created
--
-- == Valid Usage (Implicit)
--
-- -   @device@ /must/ be a valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   @image@ /must/ be a valid 'Vulkan.Core10.Handles.Image' handle
--
-- -   @memory@ /must/ be a valid 'Vulkan.Core10.Handles.DeviceMemory'
--     handle
--
-- -   @image@ /must/ have been created, allocated, or retrieved from
--     @device@
--
-- -   @memory@ /must/ have been created, allocated, or retrieved from
--     @device@
--
-- == Host Synchronization
--
-- -   Host access to @image@ /must/ be externally synchronized
--
-- == 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
--
-- 'Vulkan.Core10.Handles.Device', 'Vulkan.Core10.Handles.DeviceMemory',
-- 'Vulkan.Core10.FundamentalTypes.DeviceSize',
-- 'Vulkan.Core10.Handles.Image'
bindImageMemory :: forall io
                 . (MonadIO io)
                => -- | @device@ is the logical device that owns the image and memory.
                   Device
                -> -- | @image@ is the image.
                   Image
                -> -- | @memory@ is the 'Vulkan.Core10.Handles.DeviceMemory' object describing
                   -- the device memory to attach.
                   DeviceMemory
                -> -- | @memoryOffset@ is the start offset of the region of @memory@ which is to
                   -- be bound to the image. The number of bytes returned in the
                   -- 'MemoryRequirements'::@size@ member in @memory@, starting from
                   -- @memoryOffset@ bytes, will be bound to the specified image.
                   ("memoryOffset" ::: DeviceSize)
                -> io ()
bindImageMemory :: Device
-> Image
-> DeviceMemory
-> ("memoryOffset" ::: DeviceSize)
-> io ()
bindImageMemory device :: Device
device image :: Image
image memory :: DeviceMemory
memory memoryOffset :: "memoryOffset" ::: DeviceSize
memoryOffset = 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 vkBindImageMemoryPtr :: FunPtr
  (Ptr Device_T
   -> Image
   -> DeviceMemory
   -> ("memoryOffset" ::: DeviceSize)
   -> IO Result)
vkBindImageMemoryPtr = DeviceCmds
-> FunPtr
     (Ptr Device_T
      -> Image
      -> DeviceMemory
      -> ("memoryOffset" ::: DeviceSize)
      -> IO Result)
pVkBindImageMemory (Device -> DeviceCmds
deviceCmds (Device
device :: Device))
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T
   -> Image
   -> DeviceMemory
   -> ("memoryOffset" ::: DeviceSize)
   -> IO Result)
vkBindImageMemoryPtr FunPtr
  (Ptr Device_T
   -> Image
   -> DeviceMemory
   -> ("memoryOffset" ::: DeviceSize)
   -> IO Result)
-> FunPtr
     (Ptr Device_T
      -> Image
      -> DeviceMemory
      -> ("memoryOffset" ::: DeviceSize)
      -> IO Result)
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr Device_T
   -> Image
   -> DeviceMemory
   -> ("memoryOffset" ::: DeviceSize)
   -> 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 "" "The function pointer for vkBindImageMemory is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkBindImageMemory' :: Ptr Device_T
-> Image
-> DeviceMemory
-> ("memoryOffset" ::: DeviceSize)
-> IO Result
vkBindImageMemory' = FunPtr
  (Ptr Device_T
   -> Image
   -> DeviceMemory
   -> ("memoryOffset" ::: DeviceSize)
   -> IO Result)
-> Ptr Device_T
-> Image
-> DeviceMemory
-> ("memoryOffset" ::: DeviceSize)
-> IO Result
mkVkBindImageMemory FunPtr
  (Ptr Device_T
   -> Image
   -> DeviceMemory
   -> ("memoryOffset" ::: DeviceSize)
   -> IO Result)
vkBindImageMemoryPtr
  Result
r <- Ptr Device_T
-> Image
-> DeviceMemory
-> ("memoryOffset" ::: DeviceSize)
-> IO Result
vkBindImageMemory' (Device -> Ptr Device_T
deviceHandle (Device
device)) (Image
image) (DeviceMemory
memory) ("memoryOffset" ::: DeviceSize
memoryOffset)
  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))


-- | VkMemoryRequirements - Structure specifying memory requirements
--
-- = See Also
--
-- 'Vulkan.Core10.FundamentalTypes.DeviceSize',
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_memory_requirements2.MemoryRequirements2',
-- 'getBufferMemoryRequirements', 'getImageMemoryRequirements'
data MemoryRequirements = MemoryRequirements
  { -- | @size@ is the size, in bytes, of the memory allocation /required/ for
    -- the resource.
    MemoryRequirements -> "memoryOffset" ::: DeviceSize
size :: DeviceSize
  , -- | @alignment@ is the alignment, in bytes, of the offset within the
    -- allocation /required/ for the resource.
    MemoryRequirements -> "memoryOffset" ::: DeviceSize
alignment :: DeviceSize
  , -- | @memoryTypeBits@ is a bitmask and contains one bit set for every
    -- supported memory type for the resource. Bit @i@ is set if and only if
    -- the memory type @i@ in the
    -- 'Vulkan.Core10.DeviceInitialization.PhysicalDeviceMemoryProperties'
    -- structure for the physical device is supported for the resource.
    MemoryRequirements -> Word32
memoryTypeBits :: Word32
  }
  deriving (Typeable, MemoryRequirements -> MemoryRequirements -> Bool
(MemoryRequirements -> MemoryRequirements -> Bool)
-> (MemoryRequirements -> MemoryRequirements -> Bool)
-> Eq MemoryRequirements
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MemoryRequirements -> MemoryRequirements -> Bool
$c/= :: MemoryRequirements -> MemoryRequirements -> Bool
== :: MemoryRequirements -> MemoryRequirements -> Bool
$c== :: MemoryRequirements -> MemoryRequirements -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (MemoryRequirements)
#endif
deriving instance Show MemoryRequirements

instance ToCStruct MemoryRequirements where
  withCStruct :: MemoryRequirements
-> (("pMemoryRequirements" ::: Ptr MemoryRequirements) -> IO b)
-> IO b
withCStruct x :: MemoryRequirements
x f :: ("pMemoryRequirements" ::: Ptr MemoryRequirements) -> IO b
f = Int
-> Int
-> (("pMemoryRequirements" ::: Ptr MemoryRequirements) -> IO b)
-> IO b
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned 24 8 ((("pMemoryRequirements" ::: Ptr MemoryRequirements) -> IO b)
 -> IO b)
-> (("pMemoryRequirements" ::: Ptr MemoryRequirements) -> IO b)
-> IO b
forall a b. (a -> b) -> a -> b
$ \p :: "pMemoryRequirements" ::: Ptr MemoryRequirements
p -> ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> MemoryRequirements -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct "pMemoryRequirements" ::: Ptr MemoryRequirements
p MemoryRequirements
x (("pMemoryRequirements" ::: Ptr MemoryRequirements) -> IO b
f "pMemoryRequirements" ::: Ptr MemoryRequirements
p)
  pokeCStruct :: ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> MemoryRequirements -> IO b -> IO b
pokeCStruct p :: "pMemoryRequirements" ::: Ptr MemoryRequirements
p MemoryRequirements{..} f :: IO b
f = do
    Ptr ("memoryOffset" ::: DeviceSize)
-> ("memoryOffset" ::: DeviceSize) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pMemoryRequirements" ::: Ptr MemoryRequirements
p ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> Int -> Ptr ("memoryOffset" ::: DeviceSize)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr DeviceSize)) ("memoryOffset" ::: DeviceSize
size)
    Ptr ("memoryOffset" ::: DeviceSize)
-> ("memoryOffset" ::: DeviceSize) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pMemoryRequirements" ::: Ptr MemoryRequirements
p ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> Int -> Ptr ("memoryOffset" ::: DeviceSize)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr DeviceSize)) ("memoryOffset" ::: DeviceSize
alignment)
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pMemoryRequirements" ::: Ptr MemoryRequirements
p ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr Word32)) (Word32
memoryTypeBits)
    IO b
f
  cStructSize :: Int
cStructSize = 24
  cStructAlignment :: Int
cStructAlignment = 8
  pokeZeroCStruct :: ("pMemoryRequirements" ::: Ptr MemoryRequirements) -> IO b -> IO b
pokeZeroCStruct p :: "pMemoryRequirements" ::: Ptr MemoryRequirements
p f :: IO b
f = do
    Ptr ("memoryOffset" ::: DeviceSize)
-> ("memoryOffset" ::: DeviceSize) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pMemoryRequirements" ::: Ptr MemoryRequirements
p ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> Int -> Ptr ("memoryOffset" ::: DeviceSize)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr DeviceSize)) ("memoryOffset" ::: DeviceSize
forall a. Zero a => a
zero)
    Ptr ("memoryOffset" ::: DeviceSize)
-> ("memoryOffset" ::: DeviceSize) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pMemoryRequirements" ::: Ptr MemoryRequirements
p ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> Int -> Ptr ("memoryOffset" ::: DeviceSize)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr DeviceSize)) ("memoryOffset" ::: DeviceSize
forall a. Zero a => a
zero)
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pMemoryRequirements" ::: Ptr MemoryRequirements
p ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr Word32)) (Word32
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct MemoryRequirements where
  peekCStruct :: ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> IO MemoryRequirements
peekCStruct p :: "pMemoryRequirements" ::: Ptr MemoryRequirements
p = do
    "memoryOffset" ::: DeviceSize
size <- Ptr ("memoryOffset" ::: DeviceSize)
-> IO ("memoryOffset" ::: DeviceSize)
forall a. Storable a => Ptr a -> IO a
peek @DeviceSize (("pMemoryRequirements" ::: Ptr MemoryRequirements
p ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> Int -> Ptr ("memoryOffset" ::: DeviceSize)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr DeviceSize))
    "memoryOffset" ::: DeviceSize
alignment <- Ptr ("memoryOffset" ::: DeviceSize)
-> IO ("memoryOffset" ::: DeviceSize)
forall a. Storable a => Ptr a -> IO a
peek @DeviceSize (("pMemoryRequirements" ::: Ptr MemoryRequirements
p ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> Int -> Ptr ("memoryOffset" ::: DeviceSize)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr DeviceSize))
    Word32
memoryTypeBits <- Ptr Word32 -> IO Word32
forall a. Storable a => Ptr a -> IO a
peek @Word32 (("pMemoryRequirements" ::: Ptr MemoryRequirements
p ("pMemoryRequirements" ::: Ptr MemoryRequirements)
-> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr Word32))
    MemoryRequirements -> IO MemoryRequirements
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MemoryRequirements -> IO MemoryRequirements)
-> MemoryRequirements -> IO MemoryRequirements
forall a b. (a -> b) -> a -> b
$ ("memoryOffset" ::: DeviceSize)
-> ("memoryOffset" ::: DeviceSize) -> Word32 -> MemoryRequirements
MemoryRequirements
             "memoryOffset" ::: DeviceSize
size "memoryOffset" ::: DeviceSize
alignment Word32
memoryTypeBits

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

instance Zero MemoryRequirements where
  zero :: MemoryRequirements
zero = ("memoryOffset" ::: DeviceSize)
-> ("memoryOffset" ::: DeviceSize) -> Word32 -> MemoryRequirements
MemoryRequirements
           "memoryOffset" ::: DeviceSize
forall a. Zero a => a
zero
           "memoryOffset" ::: DeviceSize
forall a. Zero a => a
zero
           Word32
forall a. Zero a => a
zero