{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Graphics.Vulkan.SparseResourceMemoryManagement where
import Graphics.Vulkan.Device( VkPhysicalDevice(..)
, VkDevice(..)
)
import Graphics.Vulkan.Buffer( VkBuffer(..)
)
import Data.Word( Word64
, Word32
)
import Foreign.Ptr( Ptr
, plusPtr
)
import Graphics.Vulkan.Queue( VkQueue(..)
)
import Data.Int( Int32
)
import Data.Bits( Bits
, FiniteBits
)
import Foreign.Storable( Storable(..)
)
import Graphics.Vulkan.Fence( VkFence(..)
)
import Data.Void( Void
)
import Graphics.Vulkan.Memory( VkDeviceMemory(..)
)
import Graphics.Vulkan.Sampler( VkSampleCountFlagBits(..)
)
import Graphics.Vulkan.Image( VkImageUsageFlags(..)
, VkImage(..)
, VkImageSubresource(..)
, VkImageType(..)
, VkImageAspectFlagBits(..)
, VkImageUsageFlagBits(..)
, VkImageTiling(..)
, VkImageAspectFlags(..)
)
import Graphics.Vulkan.QueueSemaphore( VkSemaphore(..)
)
import Graphics.Vulkan.Core( VkExtent3D(..)
, VkResult(..)
, VkDeviceSize(..)
, VkFlags(..)
, VkFormat(..)
, VkOffset3D(..)
, VkStructureType(..)
)
data VkSparseImageMemoryRequirements =
VkSparseImageMemoryRequirements{ vkFormatProperties :: VkSparseImageFormatProperties
, vkImageMipTailFirstLod :: Word32
, vkImageMipTailSize :: VkDeviceSize
, vkImageMipTailOffset :: VkDeviceSize
, vkImageMipTailStride :: VkDeviceSize
}
deriving (Eq)
instance Storable VkSparseImageMemoryRequirements where
sizeOf ~_ = 48
alignment ~_ = 8
peek ptr = VkSparseImageMemoryRequirements <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 20)
<*> peek (ptr `plusPtr` 24)
<*> peek (ptr `plusPtr` 32)
<*> peek (ptr `plusPtr` 40)
poke ptr poked = poke (ptr `plusPtr` 0) (vkFormatProperties (poked :: VkSparseImageMemoryRequirements))
*> poke (ptr `plusPtr` 20) (vkImageMipTailFirstLod (poked :: VkSparseImageMemoryRequirements))
*> poke (ptr `plusPtr` 24) (vkImageMipTailSize (poked :: VkSparseImageMemoryRequirements))
*> poke (ptr `plusPtr` 32) (vkImageMipTailOffset (poked :: VkSparseImageMemoryRequirements))
*> poke (ptr `plusPtr` 40) (vkImageMipTailStride (poked :: VkSparseImageMemoryRequirements))
data VkSparseMemoryBind =
VkSparseMemoryBind{ vkResourceOffset :: VkDeviceSize
, vkSize :: VkDeviceSize
, vkMemory :: VkDeviceMemory
, vkMemoryOffset :: VkDeviceSize
, vkFlags :: VkSparseMemoryBindFlags
}
deriving (Eq)
instance Storable VkSparseMemoryBind where
sizeOf ~_ = 40
alignment ~_ = 8
peek ptr = VkSparseMemoryBind <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
<*> peek (ptr `plusPtr` 24)
<*> peek (ptr `plusPtr` 32)
poke ptr poked = poke (ptr `plusPtr` 0) (vkResourceOffset (poked :: VkSparseMemoryBind))
*> poke (ptr `plusPtr` 8) (vkSize (poked :: VkSparseMemoryBind))
*> poke (ptr `plusPtr` 16) (vkMemory (poked :: VkSparseMemoryBind))
*> poke (ptr `plusPtr` 24) (vkMemoryOffset (poked :: VkSparseMemoryBind))
*> poke (ptr `plusPtr` 32) (vkFlags (poked :: VkSparseMemoryBind))
data VkSparseImageMemoryBind =
VkSparseImageMemoryBind{ vkSubresource :: VkImageSubresource
, vkOffset :: VkOffset3D
, vkExtent :: VkExtent3D
, vkMemory :: VkDeviceMemory
, vkMemoryOffset :: VkDeviceSize
, vkFlags :: VkSparseMemoryBindFlags
}
deriving (Eq)
instance Storable VkSparseImageMemoryBind where
sizeOf ~_ = 64
alignment ~_ = 8
peek ptr = VkSparseImageMemoryBind <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 12)
<*> peek (ptr `plusPtr` 24)
<*> peek (ptr `plusPtr` 40)
<*> peek (ptr `plusPtr` 48)
<*> peek (ptr `plusPtr` 56)
poke ptr poked = poke (ptr `plusPtr` 0) (vkSubresource (poked :: VkSparseImageMemoryBind))
*> poke (ptr `plusPtr` 12) (vkOffset (poked :: VkSparseImageMemoryBind))
*> poke (ptr `plusPtr` 24) (vkExtent (poked :: VkSparseImageMemoryBind))
*> poke (ptr `plusPtr` 40) (vkMemory (poked :: VkSparseImageMemoryBind))
*> poke (ptr `plusPtr` 48) (vkMemoryOffset (poked :: VkSparseImageMemoryBind))
*> poke (ptr `plusPtr` 56) (vkFlags (poked :: VkSparseImageMemoryBind))
data VkSparseImageMemoryBindInfo =
VkSparseImageMemoryBindInfo{ vkImage :: VkImage
, vkBindCount :: Word32
, vkPBinds :: Ptr VkSparseImageMemoryBind
}
deriving (Eq)
instance Storable VkSparseImageMemoryBindInfo where
sizeOf ~_ = 24
alignment ~_ = 8
peek ptr = VkSparseImageMemoryBindInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
poke ptr poked = poke (ptr `plusPtr` 0) (vkImage (poked :: VkSparseImageMemoryBindInfo))
*> poke (ptr `plusPtr` 8) (vkBindCount (poked :: VkSparseImageMemoryBindInfo))
*> poke (ptr `plusPtr` 16) (vkPBinds (poked :: VkSparseImageMemoryBindInfo))
foreign import ccall "vkGetImageSparseMemoryRequirements" vkGetImageSparseMemoryRequirements ::
VkDevice ->
VkImage ->
Ptr Word32 -> Ptr VkSparseImageMemoryRequirements -> IO ()
foreign import ccall "vkQueueBindSparse" vkQueueBindSparse ::
VkQueue -> Word32 -> Ptr VkBindSparseInfo -> VkFence -> IO VkResult
data VkBindSparseInfo =
VkBindSparseInfo{ vkSType :: VkStructureType
, vkPNext :: Ptr Void
, vkWaitSemaphoreCount :: Word32
, vkPWaitSemaphores :: Ptr VkSemaphore
, vkBufferBindCount :: Word32
, vkPBufferBinds :: Ptr VkSparseBufferMemoryBindInfo
, vkImageOpaqueBindCount :: Word32
, vkPImageOpaqueBinds :: Ptr VkSparseImageOpaqueMemoryBindInfo
, vkImageBindCount :: Word32
, vkPImageBinds :: Ptr VkSparseImageMemoryBindInfo
, vkSignalSemaphoreCount :: Word32
, vkPSignalSemaphores :: Ptr VkSemaphore
}
deriving (Eq)
instance Storable VkBindSparseInfo where
sizeOf ~_ = 96
alignment ~_ = 8
peek ptr = VkBindSparseInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
<*> peek (ptr `plusPtr` 24)
<*> peek (ptr `plusPtr` 32)
<*> peek (ptr `plusPtr` 40)
<*> peek (ptr `plusPtr` 48)
<*> peek (ptr `plusPtr` 56)
<*> peek (ptr `plusPtr` 64)
<*> peek (ptr `plusPtr` 72)
<*> peek (ptr `plusPtr` 80)
<*> peek (ptr `plusPtr` 88)
poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkBindSparseInfo))
*> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkBindSparseInfo))
*> poke (ptr `plusPtr` 16) (vkWaitSemaphoreCount (poked :: VkBindSparseInfo))
*> poke (ptr `plusPtr` 24) (vkPWaitSemaphores (poked :: VkBindSparseInfo))
*> poke (ptr `plusPtr` 32) (vkBufferBindCount (poked :: VkBindSparseInfo))
*> poke (ptr `plusPtr` 40) (vkPBufferBinds (poked :: VkBindSparseInfo))
*> poke (ptr `plusPtr` 48) (vkImageOpaqueBindCount (poked :: VkBindSparseInfo))
*> poke (ptr `plusPtr` 56) (vkPImageOpaqueBinds (poked :: VkBindSparseInfo))
*> poke (ptr `plusPtr` 64) (vkImageBindCount (poked :: VkBindSparseInfo))
*> poke (ptr `plusPtr` 72) (vkPImageBinds (poked :: VkBindSparseInfo))
*> poke (ptr `plusPtr` 80) (vkSignalSemaphoreCount (poked :: VkBindSparseInfo))
*> poke (ptr `plusPtr` 88) (vkPSignalSemaphores (poked :: VkBindSparseInfo))
data VkSparseBufferMemoryBindInfo =
VkSparseBufferMemoryBindInfo{ vkBuffer :: VkBuffer
, vkBindCount :: Word32
, vkPBinds :: Ptr VkSparseMemoryBind
}
deriving (Eq)
instance Storable VkSparseBufferMemoryBindInfo where
sizeOf ~_ = 24
alignment ~_ = 8
peek ptr = VkSparseBufferMemoryBindInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
poke ptr poked = poke (ptr `plusPtr` 0) (vkBuffer (poked :: VkSparseBufferMemoryBindInfo))
*> poke (ptr `plusPtr` 8) (vkBindCount (poked :: VkSparseBufferMemoryBindInfo))
*> poke (ptr `plusPtr` 16) (vkPBinds (poked :: VkSparseBufferMemoryBindInfo))
newtype VkSparseImageFormatFlagBits = VkSparseImageFormatFlagBits VkFlags
deriving (Eq, Storable, Bits, FiniteBits)
type VkSparseImageFormatFlags = VkSparseImageFormatFlagBits
pattern VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT = VkSparseImageFormatFlagBits 0x1
pattern VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT = VkSparseImageFormatFlagBits 0x2
pattern VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT = VkSparseImageFormatFlagBits 0x4
foreign import ccall "vkGetPhysicalDeviceSparseImageFormatProperties" vkGetPhysicalDeviceSparseImageFormatProperties ::
VkPhysicalDevice ->
VkFormat ->
VkImageType ->
VkSampleCountFlagBits ->
VkImageUsageFlags ->
VkImageTiling ->
Ptr Word32 -> Ptr VkSparseImageFormatProperties -> IO ()
newtype VkSparseMemoryBindFlagBits = VkSparseMemoryBindFlagBits VkFlags
deriving (Eq, Storable, Bits, FiniteBits)
type VkSparseMemoryBindFlags = VkSparseMemoryBindFlagBits
pattern VK_SPARSE_MEMORY_BIND_METADATA_BIT = VkSparseMemoryBindFlagBits 0x1
data VkSparseImageOpaqueMemoryBindInfo =
VkSparseImageOpaqueMemoryBindInfo{ vkImage :: VkImage
, vkBindCount :: Word32
, vkPBinds :: Ptr VkSparseMemoryBind
}
deriving (Eq)
instance Storable VkSparseImageOpaqueMemoryBindInfo where
sizeOf ~_ = 24
alignment ~_ = 8
peek ptr = VkSparseImageOpaqueMemoryBindInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
poke ptr poked = poke (ptr `plusPtr` 0) (vkImage (poked :: VkSparseImageOpaqueMemoryBindInfo))
*> poke (ptr `plusPtr` 8) (vkBindCount (poked :: VkSparseImageOpaqueMemoryBindInfo))
*> poke (ptr `plusPtr` 16) (vkPBinds (poked :: VkSparseImageOpaqueMemoryBindInfo))
data VkSparseImageFormatProperties =
VkSparseImageFormatProperties{ vkAspectMask :: VkImageAspectFlags
, vkImageGranularity :: VkExtent3D
, vkFlags :: VkSparseImageFormatFlags
}
deriving (Eq)
instance Storable VkSparseImageFormatProperties where
sizeOf ~_ = 20
alignment ~_ = 4
peek ptr = VkSparseImageFormatProperties <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 4)
<*> peek (ptr `plusPtr` 16)
poke ptr poked = poke (ptr `plusPtr` 0) (vkAspectMask (poked :: VkSparseImageFormatProperties))
*> poke (ptr `plusPtr` 4) (vkImageGranularity (poked :: VkSparseImageFormatProperties))
*> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkSparseImageFormatProperties))