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 (DsLayoutBindings, HasVulkan, HasRenderPass(..)) import Render.Code (compileVert) import Render.DescSets.Sun (Sun) import Render.ShadowMap.Code qualified as Code import Resource.Model (Vertex3d) type Pipeline = Graphics.Pipeline '[Sun] (Vertex3d ()) 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 { $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 DsLayoutBindings -> renderpass -> Settings -> ResourceT (RIO env) Pipeline allocate :: forall env renderpass. (HasVulkan env, HasRenderPass renderpass) => Tagged Sun DsLayoutBindings -> renderpass -> Settings -> ResourceT (RIO env) Pipeline allocate Tagged Sun DsLayoutBindings tset0 renderpass rp Settings settings = do (ReleaseKey _, Pipeline p) <- Maybe Extent2D -> SampleCountFlagBits -> Config '[Sun] (Vertex Packed ()) Transform () -> renderpass -> ResourceT (RIO env) (ReleaseKey, Pipeline) forall {k1} {k2} config pipeline (dsl :: [*]) (vertices :: k1) (instances :: k2) 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 DsLayoutBindings -> Settings -> Configure Pipeline config Tagged Sun DsLayoutBindings tset0 Settings settings) renderpass rp Pipeline -> ResourceT (RIO env) Pipeline forall a. a -> ResourceT (RIO env) a forall (f :: * -> *) a. Applicative f => a -> f a pure Pipeline p config :: Tagged Sun DsLayoutBindings -> Settings -> Config config :: Tagged Sun DsLayoutBindings -> Settings -> Configure Pipeline config (Tagged DsLayoutBindings set0) Settings{Maybe (Float, Float) CullModeFlagBits $sel:cull:Settings :: Settings -> CullModeFlagBits $sel:depthBias:Settings :: Settings -> Maybe (Float, Float) cull :: CullModeFlagBits depthBias :: Maybe (Float, Float) ..} = Config '[] Any Any () forall {k1} {k2} (vertices :: k1) (instances :: k2). Config '[] vertices instances () Graphics.baseConfig { $sel:cDescLayouts:Config :: Tagged '[Sun] [DsLayoutBindings] Graphics.cDescLayouts = forall (s :: [*]) b. b -> Tagged s b forall {k} (s :: k) b. b -> Tagged s b Tagged @'[Sun] [DsLayoutBindings set0] , $sel:cStages:Config :: StageSpirv Graphics.cStages = StageSpirv stageSpirv , $sel:cVertexInput:Config :: SomeStruct PipelineVertexInputStateCreateInfo Graphics.cVertexInput = forall a (pipeLayout :: [*]) vertices instances. (a ~ Pipeline pipeLayout vertices instances, HasVertexInputBindings vertices, HasVertexInputBindings instances) => SomeStruct PipelineVertexInputStateCreateInfo forall {k1} {k2} a (pipeLayout :: [*]) (vertices :: k1) (instances :: k2). (a ~ Pipeline pipeLayout vertices instances, HasVertexInputBindings vertices, HasVertexInputBindings instances) => SomeStruct PipelineVertexInputStateCreateInfo Graphics.vertexInput @Pipeline , $sel:cDepthBias:Config :: Maybe (Float, Float) Graphics.cDepthBias = Maybe (Float, Float) depthBias , $sel:cCull:Config :: CullModeFlagBits Graphics.cCull = CullModeFlagBits cull } 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