{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Graphics.Vulkan.Buffer where
import Graphics.Vulkan.Device( VkDevice(..)
)
import Data.Word( Word64
, Word32
)
import Foreign.Ptr( Ptr
, plusPtr
)
import Data.Bits( Bits
, FiniteBits
)
import Foreign.Storable( Storable(..)
)
import Data.Void( Void
)
import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
, PFN_vkAllocationFunction
, PFN_vkReallocationFunction
, PFN_vkInternalAllocationNotification
, VkAllocationCallbacks(..)
, VkSystemAllocationScope(..)
, PFN_vkFreeFunction
, PFN_vkInternalFreeNotification
)
import Graphics.Vulkan.Core( VkResult(..)
, VkDeviceSize(..)
, VkFlags(..)
, VkStructureType(..)
, VkSharingMode(..)
)
import Foreign.C.Types( CSize(..)
)
foreign import ccall "vkCreateBuffer" vkCreateBuffer ::
VkDevice ->
Ptr VkBufferCreateInfo ->
Ptr VkAllocationCallbacks -> Ptr VkBuffer -> IO VkResult
newtype VkBufferCreateFlagBits = VkBufferCreateFlagBits VkFlags
deriving (Eq, Storable, Bits, FiniteBits)
type VkBufferCreateFlags = VkBufferCreateFlagBits
pattern VK_BUFFER_CREATE_SPARSE_BINDING_BIT = VkBufferCreateFlagBits 0x1
pattern VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = VkBufferCreateFlagBits 0x2
pattern VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = VkBufferCreateFlagBits 0x4
newtype VkBufferUsageFlagBits = VkBufferUsageFlagBits VkFlags
deriving (Eq, Storable, Bits, FiniteBits)
type VkBufferUsageFlags = VkBufferUsageFlagBits
pattern VK_BUFFER_USAGE_TRANSFER_SRC_BIT = VkBufferUsageFlagBits 0x1
pattern VK_BUFFER_USAGE_TRANSFER_DST_BIT = VkBufferUsageFlagBits 0x2
pattern VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = VkBufferUsageFlagBits 0x4
pattern VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT = VkBufferUsageFlagBits 0x8
pattern VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT = VkBufferUsageFlagBits 0x10
pattern VK_BUFFER_USAGE_STORAGE_BUFFER_BIT = VkBufferUsageFlagBits 0x20
pattern VK_BUFFER_USAGE_INDEX_BUFFER_BIT = VkBufferUsageFlagBits 0x40
pattern VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = VkBufferUsageFlagBits 0x80
pattern VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = VkBufferUsageFlagBits 0x100
foreign import ccall "vkDestroyBuffer" vkDestroyBuffer ::
VkDevice -> VkBuffer -> Ptr VkAllocationCallbacks -> IO ()
newtype VkBuffer = VkBuffer Word64
deriving (Eq, Storable)
data VkBufferCreateInfo =
VkBufferCreateInfo{ vkSType :: VkStructureType
, vkPNext :: Ptr Void
, vkFlags :: VkBufferCreateFlags
, vkSize :: VkDeviceSize
, vkUsage :: VkBufferUsageFlags
, vkSharingMode :: VkSharingMode
, vkQueueFamilyIndexCount :: Word32
, vkPQueueFamilyIndices :: Ptr Word32
}
deriving (Eq)
instance Storable VkBufferCreateInfo where
sizeOf ~_ = 56
alignment ~_ = 8
peek ptr = VkBufferCreateInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
<*> peek (ptr `plusPtr` 24)
<*> peek (ptr `plusPtr` 32)
<*> peek (ptr `plusPtr` 36)
<*> peek (ptr `plusPtr` 40)
<*> peek (ptr `plusPtr` 48)
poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkBufferCreateInfo))
*> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkBufferCreateInfo))
*> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkBufferCreateInfo))
*> poke (ptr `plusPtr` 24) (vkSize (poked :: VkBufferCreateInfo))
*> poke (ptr `plusPtr` 32) (vkUsage (poked :: VkBufferCreateInfo))
*> poke (ptr `plusPtr` 36) (vkSharingMode (poked :: VkBufferCreateInfo))
*> poke (ptr `plusPtr` 40) (vkQueueFamilyIndexCount (poked :: VkBufferCreateInfo))
*> poke (ptr `plusPtr` 48) (vkPQueueFamilyIndices (poked :: VkBufferCreateInfo))