{-# language CPP #-}
module Graphics.Vulkan.Core11.Promoted_From_VK_KHR_get_memory_requirements2 ( getBufferMemoryRequirements2
, getImageMemoryRequirements2
, getImageSparseMemoryRequirements2
, BufferMemoryRequirementsInfo2(..)
, ImageMemoryRequirementsInfo2(..)
, ImageSparseMemoryRequirementsInfo2(..)
, MemoryRequirements2(..)
, SparseImageMemoryRequirements2(..)
, MemoryRequirements2KHR
, StructureType(..)
) where
import Control.Exception.Base (bracket)
import Data.Typeable (eqT)
import Foreign.Marshal.Alloc (allocaBytesAligned)
import Foreign.Marshal.Alloc (callocBytes)
import Foreign.Marshal.Alloc (free)
import GHC.Ptr (castPtr)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (evalContT)
import Data.Vector (generateM)
import Data.Type.Equality ((:~:)(Refl))
import Data.Typeable (Typeable)
import Foreign.Storable (Storable)
import Foreign.Storable (Storable(peek))
import Foreign.Storable (Storable(poke))
import qualified Foreign.Storable (Storable(..))
import Foreign.Ptr (FunPtr)
import Foreign.Ptr (Ptr)
import Data.Word (Word32)
import Data.Kind (Type)
import Control.Monad.Trans.Cont (ContT(..))
import Data.Vector (Vector)
import Graphics.Vulkan.CStruct.Utils (advancePtrBytes)
import Graphics.Vulkan.NamedType ((:::))
import Graphics.Vulkan.Core10.Handles (Buffer)
import Graphics.Vulkan.CStruct.Extends (Chain)
import Graphics.Vulkan.Core10.Handles (Device)
import Graphics.Vulkan.Core10.Handles (Device(..))
import Graphics.Vulkan.Dynamic (DeviceCmds(pVkGetBufferMemoryRequirements2))
import Graphics.Vulkan.Dynamic (DeviceCmds(pVkGetImageMemoryRequirements2))
import Graphics.Vulkan.Dynamic (DeviceCmds(pVkGetImageSparseMemoryRequirements2))
import Graphics.Vulkan.Core10.Handles (Device_T)
import Graphics.Vulkan.CStruct.Extends (Extends)
import Graphics.Vulkan.CStruct.Extends (Extensible(..))
import Graphics.Vulkan.CStruct (FromCStruct)
import Graphics.Vulkan.CStruct (FromCStruct(..))
import Graphics.Vulkan.Core10.Handles (Image)
import {-# SOURCE #-} Graphics.Vulkan.Core11.Promoted_From_VK_KHR_sampler_ycbcr_conversion (ImagePlaneMemoryRequirementsInfo)
import {-# SOURCE #-} Graphics.Vulkan.Core11.Promoted_From_VK_KHR_dedicated_allocation (MemoryDedicatedRequirements)
import Graphics.Vulkan.Core10.MemoryManagement (MemoryRequirements)
import Graphics.Vulkan.CStruct.Extends (PeekChain)
import Graphics.Vulkan.CStruct.Extends (PeekChain(..))
import Graphics.Vulkan.CStruct.Extends (PokeChain)
import Graphics.Vulkan.CStruct.Extends (PokeChain(..))
import Graphics.Vulkan.Core10.SparseResourceMemoryManagement (SparseImageMemoryRequirements)
import Graphics.Vulkan.Core10.Enums.StructureType (StructureType)
import Graphics.Vulkan.CStruct (ToCStruct)
import Graphics.Vulkan.CStruct (ToCStruct(..))
import Graphics.Vulkan.Zero (Zero(..))
import Graphics.Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2))
import Graphics.Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2))
import Graphics.Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2))
import Graphics.Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2))
import Graphics.Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2))
import Graphics.Vulkan.Core10.Enums.StructureType (StructureType(..))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
unsafe
#endif
"dynamic" mkVkGetBufferMemoryRequirements2
:: FunPtr (Ptr Device_T -> Ptr BufferMemoryRequirementsInfo2 -> Ptr (MemoryRequirements2 a) -> IO ()) -> Ptr Device_T -> Ptr BufferMemoryRequirementsInfo2 -> Ptr (MemoryRequirements2 a) -> IO ()
getBufferMemoryRequirements2 :: (PokeChain a, PeekChain a) => Device -> BufferMemoryRequirementsInfo2 -> IO (MemoryRequirements2 a)
getBufferMemoryRequirements2 device info = evalContT $ do
let vkGetBufferMemoryRequirements2' = mkVkGetBufferMemoryRequirements2 (pVkGetBufferMemoryRequirements2 (deviceCmds (device :: Device)))
pInfo <- ContT $ withCStruct (info)
pPMemoryRequirements <- ContT (withZeroCStruct @(MemoryRequirements2 _))
lift $ vkGetBufferMemoryRequirements2' (deviceHandle (device)) pInfo (pPMemoryRequirements)
pMemoryRequirements <- lift $ peekCStruct @(MemoryRequirements2 _) pPMemoryRequirements
pure $ (pMemoryRequirements)
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
unsafe
#endif
"dynamic" mkVkGetImageMemoryRequirements2
:: FunPtr (Ptr Device_T -> Ptr (ImageMemoryRequirementsInfo2 a) -> Ptr (MemoryRequirements2 b) -> IO ()) -> Ptr Device_T -> Ptr (ImageMemoryRequirementsInfo2 a) -> Ptr (MemoryRequirements2 b) -> IO ()
getImageMemoryRequirements2 :: (PokeChain a, PokeChain b, PeekChain b) => Device -> ImageMemoryRequirementsInfo2 a -> IO (MemoryRequirements2 b)
getImageMemoryRequirements2 device info = evalContT $ do
let vkGetImageMemoryRequirements2' = mkVkGetImageMemoryRequirements2 (pVkGetImageMemoryRequirements2 (deviceCmds (device :: Device)))
pInfo <- ContT $ withCStruct (info)
pPMemoryRequirements <- ContT (withZeroCStruct @(MemoryRequirements2 _))
lift $ vkGetImageMemoryRequirements2' (deviceHandle (device)) pInfo (pPMemoryRequirements)
pMemoryRequirements <- lift $ peekCStruct @(MemoryRequirements2 _) pPMemoryRequirements
pure $ (pMemoryRequirements)
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
unsafe
#endif
"dynamic" mkVkGetImageSparseMemoryRequirements2
:: FunPtr (Ptr Device_T -> Ptr ImageSparseMemoryRequirementsInfo2 -> Ptr Word32 -> Ptr SparseImageMemoryRequirements2 -> IO ()) -> Ptr Device_T -> Ptr ImageSparseMemoryRequirementsInfo2 -> Ptr Word32 -> Ptr SparseImageMemoryRequirements2 -> IO ()
getImageSparseMemoryRequirements2 :: Device -> ImageSparseMemoryRequirementsInfo2 -> IO (("sparseMemoryRequirements" ::: Vector SparseImageMemoryRequirements2))
getImageSparseMemoryRequirements2 device info = evalContT $ do
let vkGetImageSparseMemoryRequirements2' = mkVkGetImageSparseMemoryRequirements2 (pVkGetImageSparseMemoryRequirements2 (deviceCmds (device :: Device)))
let device' = deviceHandle (device)
pInfo <- ContT $ withCStruct (info)
pPSparseMemoryRequirementCount <- ContT $ bracket (callocBytes @Word32 4) free
lift $ vkGetImageSparseMemoryRequirements2' device' pInfo (pPSparseMemoryRequirementCount) (nullPtr)
pSparseMemoryRequirementCount <- lift $ peek @Word32 pPSparseMemoryRequirementCount
pPSparseMemoryRequirements <- ContT $ bracket (callocBytes @SparseImageMemoryRequirements2 ((fromIntegral (pSparseMemoryRequirementCount)) * 64)) free
_ <- traverse (\i -> ContT $ pokeZeroCStruct (pPSparseMemoryRequirements `advancePtrBytes` (i * 64) :: Ptr SparseImageMemoryRequirements2) . ($ ())) [0..(fromIntegral (pSparseMemoryRequirementCount)) - 1]
lift $ vkGetImageSparseMemoryRequirements2' device' pInfo (pPSparseMemoryRequirementCount) ((pPSparseMemoryRequirements))
pSparseMemoryRequirementCount' <- lift $ peek @Word32 pPSparseMemoryRequirementCount
pSparseMemoryRequirements' <- lift $ generateM (fromIntegral (pSparseMemoryRequirementCount')) (\i -> peekCStruct @SparseImageMemoryRequirements2 (((pPSparseMemoryRequirements) `advancePtrBytes` (64 * (i)) :: Ptr SparseImageMemoryRequirements2)))
pure $ (pSparseMemoryRequirements')
data BufferMemoryRequirementsInfo2 = BufferMemoryRequirementsInfo2
{
buffer :: Buffer }
deriving (Typeable)
deriving instance Show BufferMemoryRequirementsInfo2
instance ToCStruct BufferMemoryRequirementsInfo2 where
withCStruct x f = allocaBytesAligned 24 8 $ \p -> pokeCStruct p x (f p)
pokeCStruct p BufferMemoryRequirementsInfo2{..} f = do
poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2)
poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
poke ((p `plusPtr` 16 :: Ptr Buffer)) (buffer)
f
cStructSize = 24
cStructAlignment = 8
pokeZeroCStruct p f = do
poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2)
poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
poke ((p `plusPtr` 16 :: Ptr Buffer)) (zero)
f
instance FromCStruct BufferMemoryRequirementsInfo2 where
peekCStruct p = do
buffer <- peek @Buffer ((p `plusPtr` 16 :: Ptr Buffer))
pure $ BufferMemoryRequirementsInfo2
buffer
instance Storable BufferMemoryRequirementsInfo2 where
sizeOf ~_ = 24
alignment ~_ = 8
peek = peekCStruct
poke ptr poked = pokeCStruct ptr poked (pure ())
instance Zero BufferMemoryRequirementsInfo2 where
zero = BufferMemoryRequirementsInfo2
zero
data ImageMemoryRequirementsInfo2 (es :: [Type]) = ImageMemoryRequirementsInfo2
{
next :: Chain es
,
image :: Image
}
deriving (Typeable)
deriving instance Show (Chain es) => Show (ImageMemoryRequirementsInfo2 es)
instance Extensible ImageMemoryRequirementsInfo2 where
extensibleType = STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2
setNext x next = x{next = next}
getNext ImageMemoryRequirementsInfo2{..} = next
extends :: forall e b proxy. Typeable e => proxy e -> (Extends ImageMemoryRequirementsInfo2 e => b) -> Maybe b
extends _ f
| Just Refl <- eqT @e @ImagePlaneMemoryRequirementsInfo = Just f
| otherwise = Nothing
instance PokeChain es => ToCStruct (ImageMemoryRequirementsInfo2 es) where
withCStruct x f = allocaBytesAligned 24 8 $ \p -> pokeCStruct p x (f p)
pokeCStruct p ImageMemoryRequirementsInfo2{..} f = evalContT $ do
lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2)
pNext'' <- fmap castPtr . ContT $ withChain (next)
lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) pNext''
lift $ poke ((p `plusPtr` 16 :: Ptr Image)) (image)
lift $ f
cStructSize = 24
cStructAlignment = 8
pokeZeroCStruct p f = evalContT $ do
lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2)
pNext' <- fmap castPtr . ContT $ withZeroChain @es
lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) pNext'
lift $ poke ((p `plusPtr` 16 :: Ptr Image)) (zero)
lift $ f
instance PeekChain es => FromCStruct (ImageMemoryRequirementsInfo2 es) where
peekCStruct p = do
pNext <- peek @(Ptr ()) ((p `plusPtr` 8 :: Ptr (Ptr ())))
next <- peekChain (castPtr pNext)
image <- peek @Image ((p `plusPtr` 16 :: Ptr Image))
pure $ ImageMemoryRequirementsInfo2
next image
instance es ~ '[] => Zero (ImageMemoryRequirementsInfo2 es) where
zero = ImageMemoryRequirementsInfo2
()
zero
data ImageSparseMemoryRequirementsInfo2 = ImageSparseMemoryRequirementsInfo2
{
image :: Image }
deriving (Typeable)
deriving instance Show ImageSparseMemoryRequirementsInfo2
instance ToCStruct ImageSparseMemoryRequirementsInfo2 where
withCStruct x f = allocaBytesAligned 24 8 $ \p -> pokeCStruct p x (f p)
pokeCStruct p ImageSparseMemoryRequirementsInfo2{..} f = do
poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2)
poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
poke ((p `plusPtr` 16 :: Ptr Image)) (image)
f
cStructSize = 24
cStructAlignment = 8
pokeZeroCStruct p f = do
poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2)
poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
poke ((p `plusPtr` 16 :: Ptr Image)) (zero)
f
instance FromCStruct ImageSparseMemoryRequirementsInfo2 where
peekCStruct p = do
image <- peek @Image ((p `plusPtr` 16 :: Ptr Image))
pure $ ImageSparseMemoryRequirementsInfo2
image
instance Storable ImageSparseMemoryRequirementsInfo2 where
sizeOf ~_ = 24
alignment ~_ = 8
peek = peekCStruct
poke ptr poked = pokeCStruct ptr poked (pure ())
instance Zero ImageSparseMemoryRequirementsInfo2 where
zero = ImageSparseMemoryRequirementsInfo2
zero
data MemoryRequirements2 (es :: [Type]) = MemoryRequirements2
{
next :: Chain es
,
memoryRequirements :: MemoryRequirements
}
deriving (Typeable)
deriving instance Show (Chain es) => Show (MemoryRequirements2 es)
instance Extensible MemoryRequirements2 where
extensibleType = STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2
setNext x next = x{next = next}
getNext MemoryRequirements2{..} = next
extends :: forall e b proxy. Typeable e => proxy e -> (Extends MemoryRequirements2 e => b) -> Maybe b
extends _ f
| Just Refl <- eqT @e @MemoryDedicatedRequirements = Just f
| otherwise = Nothing
instance PokeChain es => ToCStruct (MemoryRequirements2 es) where
withCStruct x f = allocaBytesAligned 40 8 $ \p -> pokeCStruct p x (f p)
pokeCStruct p MemoryRequirements2{..} f = evalContT $ do
lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2)
pNext'' <- fmap castPtr . ContT $ withChain (next)
lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) pNext''
ContT $ pokeCStruct ((p `plusPtr` 16 :: Ptr MemoryRequirements)) (memoryRequirements) . ($ ())
lift $ f
cStructSize = 40
cStructAlignment = 8
pokeZeroCStruct p f = evalContT $ do
lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2)
pNext' <- fmap castPtr . ContT $ withZeroChain @es
lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) pNext'
ContT $ pokeCStruct ((p `plusPtr` 16 :: Ptr MemoryRequirements)) (zero) . ($ ())
lift $ f
instance PeekChain es => FromCStruct (MemoryRequirements2 es) where
peekCStruct p = do
pNext <- peek @(Ptr ()) ((p `plusPtr` 8 :: Ptr (Ptr ())))
next <- peekChain (castPtr pNext)
memoryRequirements <- peekCStruct @MemoryRequirements ((p `plusPtr` 16 :: Ptr MemoryRequirements))
pure $ MemoryRequirements2
next memoryRequirements
instance es ~ '[] => Zero (MemoryRequirements2 es) where
zero = MemoryRequirements2
()
zero
data SparseImageMemoryRequirements2 = SparseImageMemoryRequirements2
{
memoryRequirements :: SparseImageMemoryRequirements }
deriving (Typeable)
deriving instance Show SparseImageMemoryRequirements2
instance ToCStruct SparseImageMemoryRequirements2 where
withCStruct x f = allocaBytesAligned 64 8 $ \p -> pokeCStruct p x (f p)
pokeCStruct p SparseImageMemoryRequirements2{..} f = evalContT $ do
lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2)
lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
ContT $ pokeCStruct ((p `plusPtr` 16 :: Ptr SparseImageMemoryRequirements)) (memoryRequirements) . ($ ())
lift $ f
cStructSize = 64
cStructAlignment = 8
pokeZeroCStruct p f = evalContT $ do
lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2)
lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
ContT $ pokeCStruct ((p `plusPtr` 16 :: Ptr SparseImageMemoryRequirements)) (zero) . ($ ())
lift $ f
instance FromCStruct SparseImageMemoryRequirements2 where
peekCStruct p = do
memoryRequirements <- peekCStruct @SparseImageMemoryRequirements ((p `plusPtr` 16 :: Ptr SparseImageMemoryRequirements))
pure $ SparseImageMemoryRequirements2
memoryRequirements
instance Zero SparseImageMemoryRequirements2 where
zero = SparseImageMemoryRequirements2
zero
type MemoryRequirements2KHR = MemoryRequirements2