module Render.ShadowMap.Pipeline ( Settings(..) , defaults , Pipeline , allocate , Config , config , stageCode , stageSpirv ) where import RIO import Control.Monad.Trans.Resource (ResourceT) import Data.Tagged (Tagged(..)) import Geomancy (Transform) import Vulkan.Core10 qualified as Vk import Engine.Vulkan.Pipeline.Graphics qualified as Graphics import Engine.Vulkan.Types (HasVulkan, HasRenderPass(..), DsBindings) import Render.Code (compileVert) import Render.DescSets.Set0 (vertexPos, instanceTransform) import Render.DescSets.Sun (Sun) import Render.ShadowMap.Code qualified as Code type Pipeline = Graphics.Pipeline '[Sun] () Transform type Config = Graphics.Configure Pipeline type instance Graphics.Specialization Pipeline = () data Settings = Settings { Settings -> CullModeFlagBits cull :: Vk.CullModeFlagBits , Settings -> Maybe (Float, Float) depthBias :: Maybe (Float, Float) } defaults :: Settings defaults :: Settings defaults = Settings :: CullModeFlagBits -> Maybe (Float, Float) -> Settings Settings { $sel:cull:Settings :: CullModeFlagBits cull = CullModeFlagBits Vk.CULL_MODE_BACK_BIT , $sel:depthBias:Settings :: Maybe (Float, Float) depthBias = (Float, Float) -> Maybe (Float, Float) forall a. a -> Maybe a Just (Float 2.0, Float 2.5) } allocate :: ( HasVulkan env , HasRenderPass renderpass ) => Tagged Sun DsBindings -> renderpass -> Settings -> ResourceT (RIO env) Pipeline allocate :: forall env renderpass. (HasVulkan env, HasRenderPass renderpass) => Tagged Sun DsBindings -> renderpass -> Settings -> ResourceT (RIO env) Pipeline allocate Tagged Sun DsBindings tset0 renderpass rp Settings settings = do (ReleaseKey _, Pipeline p) <- Maybe Extent2D -> SampleCountFlagBits -> Config '[Sun] () Transform () -> renderpass -> ResourceT (RIO env) (ReleaseKey, Pipeline) forall config pipeline (dsl :: [*]) vertices instances spec env (m :: * -> *) renderpass. (config ~ Configure pipeline, pipeline ~ Pipeline dsl vertices instances, spec ~ Specialization pipeline, Specialization spec, HasCallStack, MonadVulkan env m, MonadResource m, HasRenderPass renderpass) => Maybe Extent2D -> SampleCountFlagBits -> Config dsl vertices instances spec -> renderpass -> m (ReleaseKey, pipeline) Graphics.allocate Maybe Extent2D forall a. Maybe a Nothing SampleCountFlagBits Vk.SAMPLE_COUNT_1_BIT (Tagged Sun DsBindings -> Settings -> Configure Pipeline config Tagged Sun DsBindings tset0 Settings settings) renderpass rp Pipeline -> ResourceT (RIO env) Pipeline forall (f :: * -> *) a. Applicative f => a -> f a pure Pipeline p config :: Tagged Sun DsBindings -> Settings -> Config config :: Tagged Sun DsBindings -> Settings -> Configure Pipeline config (Tagged DsBindings set0) Settings{Maybe (Float, Float) CullModeFlagBits depthBias :: Maybe (Float, Float) cull :: CullModeFlagBits $sel:depthBias:Settings :: Settings -> Maybe (Float, Float) $sel:cull:Settings :: Settings -> CullModeFlagBits ..} = Config '[] Any Any () forall vertices instances. Config '[] vertices instances () Graphics.baseConfig { $sel:cDescLayouts:Config :: Tagged '[Sun] [DsBindings] Graphics.cDescLayouts = forall {s :: [*]} {b}. b -> Tagged s b forall {k} (s :: k) b. b -> Tagged s b Tagged @'[Sun] [DsBindings set0] , $sel:cStages:Config :: StageSpirv Graphics.cStages = StageSpirv stageSpirv , $sel:cVertexInput:Config :: SomeStruct PipelineVertexInputStateCreateInfo Graphics.cVertexInput = SomeStruct PipelineVertexInputStateCreateInfo vertexInput , $sel:cDepthBias:Config :: Maybe (Float, Float) Graphics.cDepthBias = Maybe (Float, Float) depthBias , $sel:cCull:Config :: CullModeFlagBits Graphics.cCull = CullModeFlagBits cull } where vertexInput :: SomeStruct PipelineVertexInputStateCreateInfo vertexInput = [(VertexInputRate, [Format])] -> SomeStruct PipelineVertexInputStateCreateInfo Graphics.vertexInput [ (VertexInputRate, [Format]) vertexPos , (VertexInputRate, [Format]) instanceTransform ] stageSpirv :: Graphics.StageSpirv stageSpirv :: StageSpirv stageSpirv = ("vert" ::: ByteString) -> StageSpirv forall a. ("vert" ::: a) -> Stages (Maybe ("vert" ::: a)) Graphics.vertexOnly "vert" ::: ByteString vertSpirv vertSpirv :: ByteString vertSpirv :: "vert" ::: ByteString vertSpirv = $(compileVert Code.vert) stageCode :: Graphics.StageCode stageCode :: StageCode stageCode = ("vert" ::: Code) -> StageCode forall a. ("vert" ::: a) -> Stages (Maybe ("vert" ::: a)) Graphics.vertexOnly "vert" ::: Code Code.vert