packages feed

keid-core-0.1.4.0: src/Render/Pass.hs

{-# LANGUAGE OverloadedLists #-}

module Render.Pass
  ( usePass
  , setViewportScissor

  , beginInfo
  ) where

import RIO

import RIO.Vector.Partial ((!))
import Vulkan.Core10 qualified as Vk
import Vulkan.Zero (zero)

import Engine.Vulkan.Types (HasRenderPass(..))

usePass :: (MonadIO io, HasRenderPass a) => a -> Word32 -> Vk.CommandBuffer -> io r -> io r
usePass render imageIndex cb =
  Vk.cmdUseRenderPass
    cb
    (beginInfo render imageIndex)
    Vk.SUBPASS_CONTENTS_INLINE

beginInfo :: HasRenderPass a => a -> Word32 -> Vk.RenderPassBeginInfo '[]
beginInfo rp imageIndex = zero
  { Vk.renderPass  = getRenderPass rp
  , Vk.framebuffer = getFramebuffers rp ! fromIntegral imageIndex
  , Vk.renderArea  = getRenderArea rp
  , Vk.clearValues = getClearValues rp
  }

setViewportScissor
  :: ( HasRenderPass rp
     , MonadIO io
     )
  => Vk.CommandBuffer
  -> Vk.Extent2D
  -> rp
  -> io ()
setViewportScissor cb Vk.Extent2D{width, height} rp = do
  Vk.cmdSetViewport
    cb
    0
    [ Vk.Viewport
        { x        = 0
        , y        = 0
        , width    = realToFrac width
        , height   = realToFrac height
        , minDepth = 0
        , maxDepth = 1
        }
    ]
  Vk.cmdSetScissor
    cb
    0
    [ getRenderArea rp
    ]