module Render.Pass
  ( usePass

  , 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 :: a -> Word32 -> CommandBuffer -> io r -> io r
usePass a
render Word32
imageIndex CommandBuffer
cb =
  CommandBuffer
-> RenderPassBeginInfo '[] -> SubpassContents -> io r -> io r
forall (a :: [*]) (io :: * -> *) r.
(Extendss RenderPassBeginInfo a, PokeChain a, MonadIO io) =>
CommandBuffer
-> RenderPassBeginInfo a -> SubpassContents -> io r -> io r
Vk.cmdUseRenderPass
    CommandBuffer
cb
    (a -> Word32 -> RenderPassBeginInfo '[]
forall a. HasRenderPass a => a -> Word32 -> RenderPassBeginInfo '[]
beginInfo a
render Word32
imageIndex)
    SubpassContents
Vk.SUBPASS_CONTENTS_INLINE

beginInfo :: HasRenderPass a => a -> Word32 -> Vk.RenderPassBeginInfo '[]
beginInfo :: a -> Word32 -> RenderPassBeginInfo '[]
beginInfo a
rp Word32
imageIndex = RenderPassBeginInfo '[]
forall a. Zero a => a
zero
  { $sel:renderPass:RenderPassBeginInfo :: RenderPass
Vk.renderPass  = a -> RenderPass
forall a. HasRenderPass a => a -> RenderPass
getRenderPass a
rp
  , $sel:framebuffer:RenderPassBeginInfo :: Framebuffer
Vk.framebuffer = a -> Vector Framebuffer
forall a. HasRenderPass a => a -> Vector Framebuffer
getFramebuffers a
rp Vector Framebuffer -> Int -> Framebuffer
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
! Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
imageIndex
  , $sel:renderArea:RenderPassBeginInfo :: Rect2D
Vk.renderArea  = a -> Rect2D
forall a. HasRenderPass a => a -> Rect2D
getRenderArea a
rp
  , $sel:clearValues:RenderPassBeginInfo :: Vector ClearValue
Vk.clearValues = a -> Vector ClearValue
forall a. HasRenderPass a => a -> Vector ClearValue
getClearValues a
rp
  }