module Render.Unlit.TileMap.Pipeline ( Pipeline , allocate , allocateBlend , Config , config , configBlend , stageCode ) where import RIO import Control.Monad.Trans.Resource (ResourceT) import Data.Tagged (Tagged(..)) 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, compileFrag) import Render.DescSets.Set0 (Scene) import Render.Unlit.TileMap.Code qualified as Code import Render.Unlit.TileMap.Model qualified as Model type Pipeline = Graphics.Pipeline '[Scene] Model.Vertex Model.Attrs type Config = Graphics.Configure Pipeline type instance Graphics.Specialization Pipeline = () allocate :: ( HasVulkan env , HasRenderPass renderpass ) => Vk.SampleCountFlagBits -> Tagged Scene DsLayoutBindings -> renderpass -> ResourceT (RIO env) Pipeline allocate :: forall env renderpass. (HasVulkan env, HasRenderPass renderpass) => SampleCountFlagBits -> Tagged Scene DsLayoutBindings -> renderpass -> ResourceT (RIO env) Pipeline allocate SampleCountFlagBits multisample Tagged Scene DsLayoutBindings tset0 renderpass rp = do (ReleaseKey _, Pipeline p) <- 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 forall a. Maybe a Nothing SampleCountFlagBits multisample (Tagged Scene DsLayoutBindings -> Configure Pipeline config Tagged Scene DsLayoutBindings tset0) renderpass rp forall (f :: * -> *) a. Applicative f => a -> f a pure Pipeline p allocateBlend :: ( HasVulkan env , HasRenderPass renderpass ) => Vk.SampleCountFlagBits -> Tagged Scene DsLayoutBindings -> renderpass -> ResourceT (RIO env) Pipeline allocateBlend :: forall env renderpass. (HasVulkan env, HasRenderPass renderpass) => SampleCountFlagBits -> Tagged Scene DsLayoutBindings -> renderpass -> ResourceT (RIO env) Pipeline allocateBlend SampleCountFlagBits multisample Tagged Scene DsLayoutBindings tset0 renderpass rp = do (ReleaseKey _, Pipeline p) <- 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 forall a. Maybe a Nothing SampleCountFlagBits multisample (Tagged Scene DsLayoutBindings -> Configure Pipeline configBlend Tagged Scene DsLayoutBindings tset0) renderpass rp forall (f :: * -> *) a. Applicative f => a -> f a pure Pipeline p config :: Tagged Scene DsLayoutBindings -> Config config :: Tagged Scene DsLayoutBindings -> Configure Pipeline config (Tagged DsLayoutBindings set0) = forall vertices instances. Config '[] vertices instances () Graphics.baseConfig { $sel:cDescLayouts:Config :: Tagged '[Scene] [DsLayoutBindings] Graphics.cDescLayouts = forall {k} (s :: k) b. b -> Tagged s b Tagged @'[Scene] [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 Graphics.vertexInput @Pipeline } configBlend :: Tagged Scene DsLayoutBindings -> Config configBlend :: Tagged Scene DsLayoutBindings -> Configure Pipeline configBlend Tagged Scene DsLayoutBindings tset0 = (Tagged Scene DsLayoutBindings -> Configure Pipeline config Tagged Scene DsLayoutBindings tset0) { $sel:cBlend:Config :: Bool Graphics.cBlend = Bool True , $sel:cDepthWrite:Config :: Bool Graphics.cDepthWrite = Bool False } stageCode :: Graphics.StageCode stageCode :: StageCode stageCode = forall a. ("vert" ::: a) -> ("vert" ::: a) -> Stages (Maybe ("vert" ::: a)) Graphics.basicStages Code Code.vert Code Code.frag stageSpirv :: Graphics.StageSpirv stageSpirv :: StageSpirv stageSpirv = forall a. ("vert" ::: a) -> ("vert" ::: a) -> Stages (Maybe ("vert" ::: a)) Graphics.basicStages ByteString vertSpirv ByteString fragSpirv vertSpirv :: ByteString vertSpirv :: ByteString vertSpirv = $(compileVert Code.vert) fragSpirv :: ByteString fragSpirv :: ByteString fragSpirv = $(compileFrag Code.frag)