packages feed

keid-core-0.1.8.0: src/Resource/Vulkan/DescriptorLayout.hs

module Resource.Vulkan.DescriptorLayout where

import RIO

import Data.Vector qualified as Vector
import Engine.Vulkan.Types (getDevice, MonadVulkan)
import RIO.List qualified as List
import Vulkan.Core10 qualified as Vk
import Vulkan.Core12 qualified as Vk12
import Vulkan.CStruct.Extends (pattern (:&), pattern (::&))
import Vulkan.Zero (zero)

create
  :: MonadVulkan env m
  => Vector [(Vk.DescriptorSetLayoutBinding, Vk12.DescriptorBindingFlags)]
  -> m (Vector Vk.DescriptorSetLayout)
create dsBindings = do
  device <- asks getDevice
  Vector.forM dsBindings \bindsFlags -> do
    let
      (binds, flags) = List.unzip bindsFlags

      setCI =
        zero
          { Vk.bindings = Vector.fromList binds
          }
        ::& zero
          { Vk12.bindingFlags = Vector.fromList flags
          }
        :& ()

    Vk.createDescriptorSetLayout device setCI Nothing

forPipeline
  :: MonadVulkan env m
  => Vector Vk.DescriptorSetLayout
  -> Vector Vk.PushConstantRange
  -> m Vk.PipelineLayout
forPipeline dsLayouts pushConstantRanges = do
  device <- asks getDevice
  Vk.createPipelineLayout device layoutCI Nothing
  where
    layoutCI = Vk.PipelineLayoutCreateInfo
      { flags              = zero
      , setLayouts         = dsLayouts
      , pushConstantRanges = pushConstantRanges
      }