{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE DataKinds #-}
module Framebuffers where

import Linear
import Control.Monad.Trans.Resource
import qualified Data.Vector as V
import Foreign.C.Types (CInt)
import qualified Vulkan as Vk
import qualified Vulkan.Zero as Vk


createFramebuffer
  :: (MonadResource m)
  => Vk.Device
  -> Vk.RenderPass
  -> V.Vector Vk.ImageView
  -> Vk.ImageView
  -> V2 CInt
  -> m (V.Vector Vk.Framebuffer)
createFramebuffer
  logicalDevice
  renderPass
  swapchainImageViews
  depthImageView
  (V2 swapchainWidth swapchainHeight)
  = do

    let framebufferCreateInfo = Vk.zero
          { Vk.renderPass = renderPass
          , Vk.width = fromIntegral swapchainWidth
          , Vk.height = fromIntegral swapchainHeight
          , Vk.layers = 1
          }

    V.mapM
      (\imageView -> do
        let createInfo = framebufferCreateInfo
              {  Vk.attachments = V.fromList [ imageView, depthImageView ]
              } :: Vk.FramebufferCreateInfo '[]
        snd <$> Vk.withFramebuffer logicalDevice createInfo Nothing allocate
        )
      swapchainImageViews
