{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Graphics.Vulkan.PipelineLayout where
import Graphics.Vulkan.Device( VkDevice(..)
)
import Data.Word( Word64
, Word32
)
import Foreign.Ptr( Ptr
, plusPtr
)
import Graphics.Vulkan.DescriptorSet( VkDescriptorSetLayout(..)
)
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.Shader( VkShaderStageFlagBits(..)
, VkShaderStageFlags(..)
)
import Graphics.Vulkan.Core( VkResult(..)
, VkFlags(..)
, VkStructureType(..)
)
import Foreign.C.Types( CSize(..)
)
newtype VkPipelineLayoutCreateFlags = VkPipelineLayoutCreateFlags VkFlags
deriving (Eq, Storable)
newtype VkPipelineLayout = VkPipelineLayout Word64
deriving (Eq, Storable)
foreign import ccall "vkDestroyPipelineLayout" vkDestroyPipelineLayout ::
VkDevice -> VkPipelineLayout -> Ptr VkAllocationCallbacks -> IO ()
data VkPushConstantRange =
VkPushConstantRange{ vkStageFlags :: VkShaderStageFlags
, vkOffset :: Word32
, vkSize :: Word32
}
deriving (Eq)
instance Storable VkPushConstantRange where
sizeOf ~_ = 12
alignment ~_ = 4
peek ptr = VkPushConstantRange <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 4)
<*> peek (ptr `plusPtr` 8)
poke ptr poked = poke (ptr `plusPtr` 0) (vkStageFlags (poked :: VkPushConstantRange))
*> poke (ptr `plusPtr` 4) (vkOffset (poked :: VkPushConstantRange))
*> poke (ptr `plusPtr` 8) (vkSize (poked :: VkPushConstantRange))
data VkPipelineLayoutCreateInfo =
VkPipelineLayoutCreateInfo{ vkSType :: VkStructureType
, vkPNext :: Ptr Void
, vkFlags :: VkPipelineLayoutCreateFlags
, vkSetLayoutCount :: Word32
, vkPSetLayouts :: Ptr VkDescriptorSetLayout
, vkPushConstantRangeCount :: Word32
, vkPPushConstantRanges :: Ptr VkPushConstantRange
}
deriving (Eq)
instance Storable VkPipelineLayoutCreateInfo where
sizeOf ~_ = 48
alignment ~_ = 8
peek ptr = VkPipelineLayoutCreateInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
<*> peek (ptr `plusPtr` 20)
<*> peek (ptr `plusPtr` 24)
<*> peek (ptr `plusPtr` 32)
<*> peek (ptr `plusPtr` 40)
poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineLayoutCreateInfo))
*> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineLayoutCreateInfo))
*> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineLayoutCreateInfo))
*> poke (ptr `plusPtr` 20) (vkSetLayoutCount (poked :: VkPipelineLayoutCreateInfo))
*> poke (ptr `plusPtr` 24) (vkPSetLayouts (poked :: VkPipelineLayoutCreateInfo))
*> poke (ptr `plusPtr` 32) (vkPushConstantRangeCount (poked :: VkPipelineLayoutCreateInfo))
*> poke (ptr `plusPtr` 40) (vkPPushConstantRanges (poked :: VkPipelineLayoutCreateInfo))
foreign import ccall "vkCreatePipelineLayout" vkCreatePipelineLayout ::
VkDevice ->
Ptr VkPipelineLayoutCreateInfo ->
Ptr VkAllocationCallbacks -> Ptr VkPipelineLayout -> IO VkResult