{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Graphics.Vulkan.DescriptorSet where
import Graphics.Vulkan.Device( VkDevice(..)
)
import Graphics.Vulkan.Buffer( VkBuffer(..)
)
import Text.Read.Lex( Lexeme(Ident)
)
import GHC.Read( expectP
, choose
)
import Data.Word( Word64
, Word32
)
import Foreign.Ptr( Ptr
, plusPtr
)
import Data.Int( Int32
)
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 Text.Read( Read(..)
, parens
)
import Text.ParserCombinators.ReadPrec( prec
, (+++)
, step
)
import Graphics.Vulkan.Shader( VkShaderStageFlagBits(..)
, VkShaderStageFlags(..)
)
import Graphics.Vulkan.Sampler( VkSampler(..)
)
import Graphics.Vulkan.Image( VkImageLayout(..)
)
import Graphics.Vulkan.ImageView( VkImageView(..)
)
import Graphics.Vulkan.BufferView( VkBufferView(..)
)
import Graphics.Vulkan.Core( VkResult(..)
, VkDeviceSize(..)
, VkFlags(..)
, VkStructureType(..)
)
import Foreign.C.Types( CSize(..)
)
foreign import ccall "vkUpdateDescriptorSets" vkUpdateDescriptorSets ::
VkDevice ->
Word32 ->
Ptr VkWriteDescriptorSet ->
Word32 -> Ptr VkCopyDescriptorSet -> IO ()
newtype VkDescriptorPoolResetFlags = VkDescriptorPoolResetFlags VkFlags
deriving (Eq, Storable)
foreign import ccall "vkAllocateDescriptorSets" vkAllocateDescriptorSets ::
VkDevice ->
Ptr VkDescriptorSetAllocateInfo ->
Ptr VkDescriptorSet -> IO VkResult
data VkDescriptorBufferInfo =
VkDescriptorBufferInfo{ vkBuffer :: VkBuffer
, vkOffset :: VkDeviceSize
, vkRange :: VkDeviceSize
}
deriving (Eq)
instance Storable VkDescriptorBufferInfo where
sizeOf ~_ = 24
alignment ~_ = 8
peek ptr = VkDescriptorBufferInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
poke ptr poked = poke (ptr `plusPtr` 0) (vkBuffer (poked :: VkDescriptorBufferInfo))
*> poke (ptr `plusPtr` 8) (vkOffset (poked :: VkDescriptorBufferInfo))
*> poke (ptr `plusPtr` 16) (vkRange (poked :: VkDescriptorBufferInfo))
data VkDescriptorImageInfo =
VkDescriptorImageInfo{ vkSampler :: VkSampler
, vkImageView :: VkImageView
, vkImageLayout :: VkImageLayout
}
deriving (Eq)
instance Storable VkDescriptorImageInfo where
sizeOf ~_ = 24
alignment ~_ = 8
peek ptr = VkDescriptorImageInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
poke ptr poked = poke (ptr `plusPtr` 0) (vkSampler (poked :: VkDescriptorImageInfo))
*> poke (ptr `plusPtr` 8) (vkImageView (poked :: VkDescriptorImageInfo))
*> poke (ptr `plusPtr` 16) (vkImageLayout (poked :: VkDescriptorImageInfo))
data VkCopyDescriptorSet =
VkCopyDescriptorSet{ vkSType :: VkStructureType
, vkPNext :: Ptr Void
, vkSrcSet :: VkDescriptorSet
, vkSrcBinding :: Word32
, vkSrcArrayElement :: Word32
, vkDstSet :: VkDescriptorSet
, vkDstBinding :: Word32
, vkDstArrayElement :: Word32
, vkDescriptorCount :: Word32
}
deriving (Eq)
instance Storable VkCopyDescriptorSet where
sizeOf ~_ = 56
alignment ~_ = 8
peek ptr = VkCopyDescriptorSet <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
<*> peek (ptr `plusPtr` 24)
<*> peek (ptr `plusPtr` 28)
<*> peek (ptr `plusPtr` 32)
<*> peek (ptr `plusPtr` 40)
<*> peek (ptr `plusPtr` 44)
<*> peek (ptr `plusPtr` 48)
poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkCopyDescriptorSet))
*> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkCopyDescriptorSet))
*> poke (ptr `plusPtr` 16) (vkSrcSet (poked :: VkCopyDescriptorSet))
*> poke (ptr `plusPtr` 24) (vkSrcBinding (poked :: VkCopyDescriptorSet))
*> poke (ptr `plusPtr` 28) (vkSrcArrayElement (poked :: VkCopyDescriptorSet))
*> poke (ptr `plusPtr` 32) (vkDstSet (poked :: VkCopyDescriptorSet))
*> poke (ptr `plusPtr` 40) (vkDstBinding (poked :: VkCopyDescriptorSet))
*> poke (ptr `plusPtr` 44) (vkDstArrayElement (poked :: VkCopyDescriptorSet))
*> poke (ptr `plusPtr` 48) (vkDescriptorCount (poked :: VkCopyDescriptorSet))
foreign import ccall "vkDestroyDescriptorPool" vkDestroyDescriptorPool ::
VkDevice -> VkDescriptorPool -> Ptr VkAllocationCallbacks -> IO ()
foreign import ccall "vkCreateDescriptorSetLayout" vkCreateDescriptorSetLayout ::
VkDevice ->
Ptr VkDescriptorSetLayoutCreateInfo ->
Ptr VkAllocationCallbacks ->
Ptr VkDescriptorSetLayout -> IO VkResult
newtype VkDescriptorPool = VkDescriptorPool Word64
deriving (Eq, Storable)
foreign import ccall "vkResetDescriptorPool" vkResetDescriptorPool ::
VkDevice ->
VkDescriptorPool -> VkDescriptorPoolResetFlags -> IO VkResult
newtype VkDescriptorSetLayout = VkDescriptorSetLayout Word64
deriving (Eq, Storable)
foreign import ccall "vkFreeDescriptorSets" vkFreeDescriptorSets ::
VkDevice ->
VkDescriptorPool -> Word32 -> Ptr VkDescriptorSet -> IO VkResult
data VkDescriptorPoolCreateInfo =
VkDescriptorPoolCreateInfo{ vkSType :: VkStructureType
, vkPNext :: Ptr Void
, vkFlags :: VkDescriptorPoolCreateFlags
, vkMaxSets :: Word32
, vkPoolSizeCount :: Word32
, vkPPoolSizes :: Ptr VkDescriptorPoolSize
}
deriving (Eq)
instance Storable VkDescriptorPoolCreateInfo where
sizeOf ~_ = 40
alignment ~_ = 8
peek ptr = VkDescriptorPoolCreateInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
<*> peek (ptr `plusPtr` 20)
<*> peek (ptr `plusPtr` 24)
<*> peek (ptr `plusPtr` 32)
poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDescriptorPoolCreateInfo))
*> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDescriptorPoolCreateInfo))
*> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDescriptorPoolCreateInfo))
*> poke (ptr `plusPtr` 20) (vkMaxSets (poked :: VkDescriptorPoolCreateInfo))
*> poke (ptr `plusPtr` 24) (vkPoolSizeCount (poked :: VkDescriptorPoolCreateInfo))
*> poke (ptr `plusPtr` 32) (vkPPoolSizes (poked :: VkDescriptorPoolCreateInfo))
newtype VkDescriptorSetLayoutCreateFlags = VkDescriptorSetLayoutCreateFlags VkFlags
deriving (Eq, Storable)
data VkDescriptorSetLayoutCreateInfo =
VkDescriptorSetLayoutCreateInfo{ vkSType :: VkStructureType
, vkPNext :: Ptr Void
, vkFlags :: VkDescriptorSetLayoutCreateFlags
, vkBindingCount :: Word32
, vkPBindings :: Ptr VkDescriptorSetLayoutBinding
}
deriving (Eq)
instance Storable VkDescriptorSetLayoutCreateInfo where
sizeOf ~_ = 32
alignment ~_ = 8
peek ptr = VkDescriptorSetLayoutCreateInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
<*> peek (ptr `plusPtr` 20)
<*> peek (ptr `plusPtr` 24)
poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDescriptorSetLayoutCreateInfo))
*> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDescriptorSetLayoutCreateInfo))
*> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDescriptorSetLayoutCreateInfo))
*> poke (ptr `plusPtr` 20) (vkBindingCount (poked :: VkDescriptorSetLayoutCreateInfo))
*> poke (ptr `plusPtr` 24) (vkPBindings (poked :: VkDescriptorSetLayoutCreateInfo))
newtype VkDescriptorPoolCreateFlagBits = VkDescriptorPoolCreateFlagBits VkFlags
deriving (Eq, Storable, Bits, FiniteBits)
type VkDescriptorPoolCreateFlags = VkDescriptorPoolCreateFlagBits
instance Show VkDescriptorPoolCreateFlagBits where
showsPrec _ VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = showString "VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT"
showsPrec p (VkDescriptorPoolCreateFlagBits x) = showParen (p >= 11) (showString "VkDescriptorPoolCreateFlagBits " . showsPrec 11 x)
instance Read VkDescriptorPoolCreateFlagBits where
readPrec = parens ( choose [ ("VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT", pure VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT)
] +++
prec 10 (do
expectP (Ident "VkDescriptorPoolCreateFlagBits")
v <- step readPrec
pure (VkDescriptorPoolCreateFlagBits v)
)
)
pattern VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = VkDescriptorPoolCreateFlagBits 0x1
data VkDescriptorPoolSize =
VkDescriptorPoolSize{ vkType :: VkDescriptorType
, vkDescriptorCount :: Word32
}
deriving (Eq)
instance Storable VkDescriptorPoolSize where
sizeOf ~_ = 8
alignment ~_ = 4
peek ptr = VkDescriptorPoolSize <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 4)
poke ptr poked = poke (ptr `plusPtr` 0) (vkType (poked :: VkDescriptorPoolSize))
*> poke (ptr `plusPtr` 4) (vkDescriptorCount (poked :: VkDescriptorPoolSize))
newtype VkDescriptorSet = VkDescriptorSet Word64
deriving (Eq, Storable)
data VkWriteDescriptorSet =
VkWriteDescriptorSet{ vkSType :: VkStructureType
, vkPNext :: Ptr Void
, vkDstSet :: VkDescriptorSet
, vkDstBinding :: Word32
, vkDstArrayElement :: Word32
, vkDescriptorCount :: Word32
, vkDescriptorType :: VkDescriptorType
, vkPImageInfo :: Ptr VkDescriptorImageInfo
, vkPBufferInfo :: Ptr VkDescriptorBufferInfo
, vkPTexelBufferView :: Ptr VkBufferView
}
deriving (Eq)
instance Storable VkWriteDescriptorSet where
sizeOf ~_ = 64
alignment ~_ = 8
peek ptr = VkWriteDescriptorSet <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
<*> peek (ptr `plusPtr` 24)
<*> peek (ptr `plusPtr` 28)
<*> peek (ptr `plusPtr` 32)
<*> peek (ptr `plusPtr` 36)
<*> peek (ptr `plusPtr` 40)
<*> peek (ptr `plusPtr` 48)
<*> peek (ptr `plusPtr` 56)
poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkWriteDescriptorSet))
*> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkWriteDescriptorSet))
*> poke (ptr `plusPtr` 16) (vkDstSet (poked :: VkWriteDescriptorSet))
*> poke (ptr `plusPtr` 24) (vkDstBinding (poked :: VkWriteDescriptorSet))
*> poke (ptr `plusPtr` 28) (vkDstArrayElement (poked :: VkWriteDescriptorSet))
*> poke (ptr `plusPtr` 32) (vkDescriptorCount (poked :: VkWriteDescriptorSet))
*> poke (ptr `plusPtr` 36) (vkDescriptorType (poked :: VkWriteDescriptorSet))
*> poke (ptr `plusPtr` 40) (vkPImageInfo (poked :: VkWriteDescriptorSet))
*> poke (ptr `plusPtr` 48) (vkPBufferInfo (poked :: VkWriteDescriptorSet))
*> poke (ptr `plusPtr` 56) (vkPTexelBufferView (poked :: VkWriteDescriptorSet))
foreign import ccall "vkCreateDescriptorPool" vkCreateDescriptorPool ::
VkDevice ->
Ptr VkDescriptorPoolCreateInfo ->
Ptr VkAllocationCallbacks -> Ptr VkDescriptorPool -> IO VkResult
foreign import ccall "vkDestroyDescriptorSetLayout" vkDestroyDescriptorSetLayout ::
VkDevice ->
VkDescriptorSetLayout -> Ptr VkAllocationCallbacks -> IO ()
data VkDescriptorSetLayoutBinding =
VkDescriptorSetLayoutBinding{ vkBinding :: Word32
, vkDescriptorType :: VkDescriptorType
, vkDescriptorCount :: Word32
, vkStageFlags :: VkShaderStageFlags
, vkPImmutableSamplers :: Ptr VkSampler
}
deriving (Eq)
instance Storable VkDescriptorSetLayoutBinding where
sizeOf ~_ = 24
alignment ~_ = 8
peek ptr = VkDescriptorSetLayoutBinding <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 4)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 12)
<*> peek (ptr `plusPtr` 16)
poke ptr poked = poke (ptr `plusPtr` 0) (vkBinding (poked :: VkDescriptorSetLayoutBinding))
*> poke (ptr `plusPtr` 4) (vkDescriptorType (poked :: VkDescriptorSetLayoutBinding))
*> poke (ptr `plusPtr` 8) (vkDescriptorCount (poked :: VkDescriptorSetLayoutBinding))
*> poke (ptr `plusPtr` 12) (vkStageFlags (poked :: VkDescriptorSetLayoutBinding))
*> poke (ptr `plusPtr` 16) (vkPImmutableSamplers (poked :: VkDescriptorSetLayoutBinding))
newtype VkDescriptorType = VkDescriptorType Int32
deriving (Eq, Storable)
instance Show VkDescriptorType where
showsPrec _ VK_DESCRIPTOR_TYPE_SAMPLER = showString "VK_DESCRIPTOR_TYPE_SAMPLER"
showsPrec _ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = showString "VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER"
showsPrec _ VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE = showString "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE"
showsPrec _ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE = showString "VK_DESCRIPTOR_TYPE_STORAGE_IMAGE"
showsPrec _ VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = showString "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER"
showsPrec _ VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = showString "VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER"
showsPrec _ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER = showString "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER"
showsPrec _ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER = showString "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER"
showsPrec _ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = showString "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC"
showsPrec _ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = showString "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC"
showsPrec _ VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = showString "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT"
showsPrec p (VkDescriptorType x) = showParen (p >= 11) (showString "VkDescriptorType " . showsPrec 11 x)
instance Read VkDescriptorType where
readPrec = parens ( choose [ ("VK_DESCRIPTOR_TYPE_SAMPLER", pure VK_DESCRIPTOR_TYPE_SAMPLER)
, ("VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER", pure VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
, ("VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE", pure VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE)
, ("VK_DESCRIPTOR_TYPE_STORAGE_IMAGE", pure VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
, ("VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER", pure VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER)
, ("VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER", pure VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)
, ("VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER", pure VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)
, ("VK_DESCRIPTOR_TYPE_STORAGE_BUFFER", pure VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
, ("VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC", pure VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)
, ("VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC", pure VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)
, ("VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT", pure VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)
] +++
prec 10 (do
expectP (Ident "VkDescriptorType")
v <- step readPrec
pure (VkDescriptorType v)
)
)
pattern VK_DESCRIPTOR_TYPE_SAMPLER = VkDescriptorType 0
pattern VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = VkDescriptorType 1
pattern VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE = VkDescriptorType 2
pattern VK_DESCRIPTOR_TYPE_STORAGE_IMAGE = VkDescriptorType 3
pattern VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = VkDescriptorType 4
pattern VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = VkDescriptorType 5
pattern VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER = VkDescriptorType 6
pattern VK_DESCRIPTOR_TYPE_STORAGE_BUFFER = VkDescriptorType 7
pattern VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = VkDescriptorType 8
pattern VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = VkDescriptorType 9
pattern VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = VkDescriptorType 10
data VkDescriptorSetAllocateInfo =
VkDescriptorSetAllocateInfo{ vkSType :: VkStructureType
, vkPNext :: Ptr Void
, vkDescriptorPool :: VkDescriptorPool
, vkDescriptorSetCount :: Word32
, vkPSetLayouts :: Ptr VkDescriptorSetLayout
}
deriving (Eq)
instance Storable VkDescriptorSetAllocateInfo where
sizeOf ~_ = 40
alignment ~_ = 8
peek ptr = VkDescriptorSetAllocateInfo <$> 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) (vkSType (poked :: VkDescriptorSetAllocateInfo))
*> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDescriptorSetAllocateInfo))
*> poke (ptr `plusPtr` 16) (vkDescriptorPool (poked :: VkDescriptorSetAllocateInfo))
*> poke (ptr `plusPtr` 24) (vkDescriptorSetCount (poked :: VkDescriptorSetAllocateInfo))
*> poke (ptr `plusPtr` 32) (vkPSetLayouts (poked :: VkDescriptorSetAllocateInfo))