packages feed

keid-core-0.1.7.0: src/Engine/Vulkan/Pipeline.hs

module Engine.Vulkan.Pipeline
  ( Pipeline(..)
  , destroy
  , Specialization
  ) where

import RIO

import Data.Kind (Type)
import Data.Tagged (Tagged(..))
import Data.Vector qualified as Vector
import Vulkan.Core10 qualified as Vk

import Engine.Vulkan.Types (HasVulkan(..), DsLayouts)

data Pipeline (dsl :: [Type]) vertices instances = Pipeline
  { pipeline     :: Vk.Pipeline
  , pLayout      :: Tagged dsl Vk.PipelineLayout
  , pDescLayouts :: Tagged dsl DsLayouts
  }

destroy
  :: ( MonadIO io
     , HasVulkan ctx
     )
  => ctx
  -> Pipeline dsl vertices instances
  -> io ()
destroy context Pipeline{..} = do
  Vector.forM_ (unTagged pDescLayouts) \dsLayout ->
    Vk.destroyDescriptorSetLayout device dsLayout Nothing
  Vk.destroyPipeline device pipeline Nothing
  Vk.destroyPipelineLayout device (unTagged pLayout) Nothing
  where
    device = getDevice context

type family Specialization pipeline