{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE OverloadedLists #-} {-# LANGUAGE OverloadedRecordDot #-} {- | All the provided render passes and pipelines packaged and delivered. -} module Render.Basic where import RIO import Control.Monad.Trans.Resource (ResourceT) import Data.Kind (Type) import Data.Tagged (Tagged(..)) import Data.Type.Equality (type (~)) import RIO.FilePath ((), (<.>)) import RIO.Vector.Partial as Vector (headM) import Vulkan.Core10 qualified as Vk import Vulkan.Zero (Zero(..)) -- keid-core import Engine.Stage.Component qualified as Stage import Engine.Types (StageRIO) import Engine.Types qualified as Engine import Engine.Vulkan.Pipeline qualified as Pipeline import Engine.Vulkan.Pipeline.External (type (^)) import Engine.Vulkan.Pipeline.External qualified as External import Engine.Vulkan.Pipeline.Graphics qualified as Graphics import Engine.Vulkan.Shader qualified as Shader import Engine.Vulkan.Swapchain qualified as Swapchain import Engine.Vulkan.Types (DsLayoutBindings, HasSwapchain, HasVulkan, RenderPass(..)) -- keid-render-basic import Render.Debug.Pipeline qualified as Debug import Render.DepthOnly.Pipeline qualified as DepthOnly import Render.DescSets.Set0 (Scene) import Render.DescSets.Set0 qualified as Scene import Render.DescSets.Sun (Sun) import Render.DescSets.Sun qualified as Sun import Render.Font.EvanwSdf.Pipeline qualified as EvanwSdf import Render.ForwardMsaa (ForwardMsaa) import Render.ForwardMsaa qualified as ForwardMsaa import Render.Lit.Colored.Pipeline qualified as LitColored import Render.Lit.Material.Pipeline qualified as LitMaterial import Render.Lit.Textured.Pipeline qualified as LitTextured import Render.Samplers qualified as Samplers import Render.ShadowMap.Pipeline qualified as ShadowPipe import Render.ShadowMap.RenderPass (ShadowMap) import Render.ShadowMap.RenderPass qualified as ShadowPass import Render.Skybox.Pipeline qualified as Skybox import Render.Unlit.Colored.Pipeline qualified as UnlitColored import Render.Unlit.Line2d.Pipeline qualified as UnlitLine2d import Render.Unlit.Sprite.Pipeline qualified as UnlitSprite import Render.Unlit.Textured.Pipeline qualified as UnlitTextured import Render.Unlit.TileMap.Pipeline qualified as UnlitTileMap type Stage = Engine.Stage RenderPasses Pipelines type Frame = Engine.Frame RenderPasses Pipelines type StageFrameRIO r s a = Engine.StageFrameRIO RenderPasses Pipelines r s a -- | Basic rendering component without any extensions. type Rendering = Stage.Rendering RenderPasses Pipelines -- | Basic rendering component without any extensions and resources. rendering_ :: Rendering st rendering_ = Stage.Rendering { rAllocateRP = allocate_ , rAllocateP = allocatePipelines_ } data RenderPasses = RenderPasses { rpForwardMsaa :: ForwardMsaa , rpShadowPass :: ShadowMap } instance RenderPass RenderPasses where updateRenderpass swapchain RenderPasses{..} = RenderPasses <$> ForwardMsaa.updateMsaa swapchain rpForwardMsaa <*> pure rpShadowPass -- XXX: not a screen pass refcountRenderpass RenderPasses{..} = do refcountRenderpass rpForwardMsaa refcountRenderpass rpShadowPass data Settings = Settings { sShadowSize :: Word32 , sShadowLayers :: Word32 } deriving (Eq, Show) instance Zero Settings where zero = Settings -- XXX: 1x1 placeholder image { sShadowSize = 1 , sShadowLayers = 1 } allocate :: ( HasSwapchain swapchain , HasLogFunc env , HasVulkan env ) => Settings -> swapchain -> ResourceT (RIO env) RenderPasses allocate Settings{..} swapchain = do rpForwardMsaa <- ForwardMsaa.allocateMsaa swapchain rpShadowPass <- ShadowPass.allocate swapchain sShadowSize sShadowLayers pure RenderPasses{..} allocate_ :: ( HasSwapchain swapchain , HasLogFunc env , HasVulkan env ) => swapchain -> ResourceT (RIO env) RenderPasses allocate_ = allocate zero type Pipelines = PipelinesF Identity type PipelineObservers = PipelinesF External.Observers type PipelineWorkers = PipelinesF External.ConfigureGraphics data PipelinesF (f :: Type -> Type) = Pipelines { pMSAA :: Vk.SampleCountFlagBits , pSceneBinds :: Tagged Scene DsLayoutBindings , pSceneLayout :: Tagged '[Scene] Vk.DescriptorSetLayout , pShadowBinds :: Tagged Sun DsLayoutBindings , pShadowLayout :: Tagged '[Sun] Vk.DescriptorSetLayout , pEvanwSdf :: f ^ EvanwSdf.Pipeline , pSkybox :: f ^ Skybox.Pipeline , pDebugUV :: f ^ Debug.Pipeline , pDebugTexture :: f ^ Debug.Pipeline , pDebugShadow :: f ^ Debug.Pipeline , pDepthOnly :: f ^ DepthOnly.Pipeline , pLitColored :: f ^ LitColored.Pipeline , pLitColoredBlend :: f ^ LitColored.Pipeline , pLitMaterial :: f ^ LitMaterial.Pipeline , pLitMaterialBlend :: f ^ LitMaterial.Pipeline , pLitTextured :: f ^ LitTextured.Pipeline , pLitTexturedBlend :: f ^ LitTextured.Pipeline , pUnlitColored :: f ^ UnlitColored.Pipeline , pUnlitColoredNoDepth :: f ^ UnlitColored.Pipeline , pUnlitTextured :: f ^ UnlitTextured.Pipeline , pUnlitTexturedBlend :: f ^ UnlitTextured.Pipeline , pLine2d :: f ^ UnlitLine2d.Pipeline , pLine2dNoDepth :: f ^ UnlitLine2d.Pipeline , pSprite :: f ^ UnlitSprite.Pipeline , pSpriteOutline :: f ^ UnlitSprite.Pipeline , pTileMap :: f ^ UnlitTileMap.Pipeline , pTileMapBlend :: f ^ UnlitTileMap.Pipeline , pWireframe :: f ^ UnlitColored.Pipeline , pWireframeNoDepth :: f ^ UnlitColored.Pipeline , pShadowCast :: f ^ ShadowPipe.Pipeline } allocatePipelines_ :: HasSwapchain swapchain => swapchain -> RenderPasses -> ResourceT (StageRIO st) Pipelines allocatePipelines_ = allocatePipelinesFor Nothing Nothing allocatePipelinesFor :: ( HasSwapchain swapchain , Foldable textures , Foldable cubes ) => textures t -> cubes c -> swapchain -> RenderPasses -> ResourceT (StageRIO st) Pipelines allocatePipelinesFor textures cubes swapchain renderpasses = do samplers <- Samplers.allocate (Swapchain.getAnisotropy swapchain) allocatePipelines (Scene.mkBindings samplers textures cubes shadows) (Swapchain.getMultisample swapchain) renderpasses where shadows = renderpasses.rpShadowPass.smLayerCount allocatePipelines :: Tagged Scene DsLayoutBindings -> Vk.SampleCountFlagBits -> RenderPasses -> ResourceT (StageRIO st) Pipelines allocatePipelines pSceneBinds pMSAA RenderPasses{..} = do pEvanwSdf <- EvanwSdf.allocate pMSAA pSceneBinds rpForwardMsaa pSkybox <- Skybox.allocate pMSAA pSceneBinds rpForwardMsaa pDebugUV <- Debug.allocate Debug.UV pMSAA pSceneBinds rpForwardMsaa pDebugTexture <- Debug.allocate Debug.Texture pMSAA pSceneBinds rpForwardMsaa pDebugShadow <- Debug.allocate (Debug.Shadow 1) pMSAA pSceneBinds rpForwardMsaa pDepthOnly <- DepthOnly.allocate pMSAA pSceneBinds rpForwardMsaa pLitColored <- LitColored.allocate pMSAA pSceneBinds rpForwardMsaa pLitColoredBlend <- LitColored.allocateBlend pMSAA pSceneBinds rpForwardMsaa pLitMaterial <- LitMaterial.allocate pMSAA pSceneBinds rpForwardMsaa pLitMaterialBlend <- LitMaterial.allocateBlend pMSAA pSceneBinds rpForwardMsaa pLitTextured <- LitTextured.allocate pMSAA pSceneBinds rpForwardMsaa pLitTexturedBlend <- LitTextured.allocateBlend pMSAA pSceneBinds rpForwardMsaa pLine2d <- UnlitLine2d.allocate True pMSAA pSceneBinds rpForwardMsaa pLine2dNoDepth <- UnlitLine2d.allocate False pMSAA pSceneBinds rpForwardMsaa pSprite <- UnlitSprite.allocate pMSAA Nothing False pSceneBinds rpForwardMsaa pSpriteOutline <- UnlitSprite.allocate pMSAA Nothing True pSceneBinds rpForwardMsaa pTileMap <- UnlitTileMap.allocate pMSAA pSceneBinds rpForwardMsaa pTileMapBlend <- UnlitTileMap.allocateBlend pMSAA pSceneBinds rpForwardMsaa pUnlitColored <- UnlitColored.allocate True pMSAA pSceneBinds rpForwardMsaa pUnlitColoredNoDepth <- UnlitColored.allocate False pMSAA pSceneBinds rpForwardMsaa pUnlitTextured <- UnlitTextured.allocate pMSAA pSceneBinds rpForwardMsaa pUnlitTexturedBlend <- UnlitTextured.allocateBlend pMSAA pSceneBinds rpForwardMsaa pWireframe <- UnlitColored.allocateWireframe True pMSAA pSceneBinds rpForwardMsaa pWireframeNoDepth <- UnlitColored.allocateWireframe False pMSAA pSceneBinds rpForwardMsaa let pShadowBinds = Sun.set0 pShadowCast <- ShadowPipe.allocate pShadowBinds rpShadowPass ShadowPipe.defaults let pSceneLayout = case Vector.headM (unTagged $ Pipeline.pDescLayouts pLitColored) of Nothing -> error "pLitColored has at least set0 in layout" Just set0layout -> Tagged set0layout pShadowLayout = case Vector.headM (unTagged $ Pipeline.pDescLayouts pShadowCast) of Nothing -> error "pShadowCast has at least set0 in layout" Just set0layout -> Tagged set0layout pure Pipelines{..} allocateWorkers :: Tagged Scene DsLayoutBindings -> Vk.SampleCountFlagBits -> RenderPasses -> ResourceT (StageRIO st) PipelineWorkers allocateWorkers sceneBinds pMSAA renderPasses = do builtin <- allocatePipelines sceneBinds pMSAA renderPasses let evanwSdfFiles = Graphics.basicStages (shaderDir "evanw-sdf" <.> "vert" <.> "spv") (shaderDir "evanw-sdf" <.> "frag" <.> "spv") evanwSdfWorker <- External.spawnReflect "evanw-sdf" evanwSdfFiles \(stageCode, reflect) -> (EvanwSdf.config sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } let skyboxFiles = Graphics.basicStages (shaderDir "skybox" <.> "vert" <.> "spv") (shaderDir "skybox" <.> "frag" <.> "spv") skyboxWorker <- External.spawnReflect "skybox" skyboxFiles \(stageCode, reflect) -> (Skybox.config sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } let debugFiles = Graphics.basicStages (shaderDir "debug" <.> "vert" <.> "spv") (shaderDir "debug" <.> "frag" <.> "spv") debugUVWorker <- External.spawnReflect "debug-uv" debugFiles \(stageCode, reflect) -> (Debug.config Debug.UV sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } debugTextureWorker <- External.spawnReflect "debug-texture" debugFiles \(stageCode, reflect) -> (Debug.config Debug.Texture sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } debugShadowWorker <- External.spawnReflect "debug-shadow" debugFiles \(stageCode, reflect) -> (Debug.config (Debug.Shadow 1) sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } let depthOnlyFiles = Graphics.vertexOnly (shaderDir "depth-only" <.> "vert" <.> "spv") depthOnlyWorker <- External.spawnReflect "debug" depthOnlyFiles \(stageCode, reflect) -> (DepthOnly.config sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } let litColoredFiles = Graphics.basicStages (shaderDir "lit-colored" <.> "vert" <.> "spv") (shaderDir "lit-colored" <.> "frag" <.> "spv") litColoredWorker <- External.spawnReflect "lit-colored" litColoredFiles \(stageCode, reflect) -> (LitColored.config sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } litColoredBlendWorker <- External.spawnReflect "lit-colored-blend" litColoredFiles \(stageCode, reflect) -> (LitColored.configBlend sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } let litMaterialFiles = Graphics.basicStages (shaderDir "lit-material" <.> "vert" <.> "spv") (shaderDir "lit-material" <.> "frag" <.> "spv") litMaterialWorker <- External.spawnReflect "lit-material" litMaterialFiles \(stageCode, reflect) -> (LitMaterial.config sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } litMaterialBlendWorker <- External.spawnReflect "lit-material-blend" litMaterialFiles \(stageCode, reflect) -> (LitMaterial.configBlend sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } let litTexturedFiles = Graphics.basicStages (shaderDir "lit-textured" <.> "vert" <.> "spv") (shaderDir "lit-textured" <.> "frag" <.> "spv") litTexturedWorker <- External.spawnReflect "lit-textured" litTexturedFiles \(stageCode, reflect) -> (LitTextured.config sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } litTexturedBlendWorker <- External.spawnReflect "lit-textured-blend" litTexturedFiles \(stageCode, reflect) -> (LitTextured.configBlend sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } let line2dFiles = Graphics.basicStages (shaderDir "line-2d" <.> "vert" <.> "spv") (shaderDir "line-2d" <.> "frag" <.> "spv") line2dWorker <- External.spawnReflect "unlit-colored" line2dFiles \(stageCode, reflect) -> (UnlitLine2d.config True sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } line2dNoDepthWorker <- External.spawnReflect "unlit-colored-nodepth" line2dFiles \(stageCode, reflect) -> (UnlitLine2d.config False sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } let unlitColoredFiles = Graphics.basicStages (shaderDir "unlit-colored" <.> "vert" <.> "spv") (shaderDir "unlit-colored" <.> "frag" <.> "spv") unlitColoredWorker <- External.spawnReflect "unlit-colored" unlitColoredFiles \(stageCode, reflect) -> (UnlitColored.config True sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } unlitColoredNoDepthWorker <- External.spawnReflect "unlit-colored-nodepth" unlitColoredFiles \(stageCode, reflect) -> (UnlitColored.config False sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } let unlitTexturedFiles = Graphics.basicStages (shaderDir "unlit-textured" <.> "vert" <.> "spv") (shaderDir "unlit-textured" <.> "frag" <.> "spv") unlitTexturedWorker <- External.spawnReflect "unlit-textured" unlitTexturedFiles \(stageCode, reflect) -> (UnlitTextured.config sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } unlitTexturedBlendWorker <- External.spawnReflect "unlit-textured" unlitTexturedFiles \(stageCode, reflect) -> (UnlitTextured.configBlend sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } let spriteFiles = Graphics.basicStages (shaderDir "sprite" <.> "vert" <.> "spv") (shaderDir "sprite" <.> "frag" <.> "spv") spriteWorker <- External.spawnReflect "sprite" spriteFiles \(stageCode, reflect) -> (UnlitSprite.config Nothing False sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } spriteOutlineWorker <- External.spawnReflect "sprite" spriteFiles \(stageCode, reflect) -> (UnlitSprite.config Nothing True sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } let tileMapFiles = Graphics.basicStages (shaderDir "tilemap" <.> "vert" <.> "spv") (shaderDir "tilemap" <.> "frag" <.> "spv") tileMapWorker <- External.spawnReflect "tilemap" tileMapFiles \(stageCode, reflect) -> (UnlitTileMap.config sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } tileMapBlendWorker <- External.spawnReflect "tilemap" tileMapFiles \(stageCode, reflect) -> (UnlitTileMap.configBlend sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } wireframeWorker <- External.spawnReflect "wireframe" unlitColoredFiles \(stageCode, reflect) -> (UnlitColored.configWireframe True sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } wireframeNoDepthWorker <- External.spawnReflect "wireframe-nodepth" unlitColoredFiles \(stageCode, reflect) -> (UnlitColored.configWireframe False sceneBinds) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } let shadowCastFiles = Graphics.vertexOnly (shaderDir "shadow-cast" <.> "vert" <.> "spv") shadowCastWorker <- External.spawnReflect "shadow-cast" shadowCastFiles \(stageCode, reflect) -> (ShadowPipe.config (pShadowBinds builtin) ShadowPipe.defaults) { Graphics.cStages = stageCode , Graphics.cReflect = Just reflect } pure builtin { pEvanwSdf = evanwSdfWorker , pSkybox = skyboxWorker , pDebugUV = debugUVWorker , pDebugTexture = debugTextureWorker , pDebugShadow = debugShadowWorker , pDepthOnly = depthOnlyWorker , pLitColored = litColoredWorker , pLitColoredBlend = litColoredBlendWorker , pLitMaterial = litMaterialWorker , pLitMaterialBlend = litMaterialBlendWorker , pLitTextured = litTexturedWorker , pLitTexturedBlend = litTexturedBlendWorker , pLine2d = line2dWorker , pLine2dNoDepth = line2dNoDepthWorker , pUnlitColored = unlitColoredWorker , pUnlitColoredNoDepth = unlitColoredNoDepthWorker , pUnlitTextured = unlitTexturedWorker , pUnlitTexturedBlend = unlitTexturedBlendWorker , pSprite = spriteWorker , pSpriteOutline = spriteOutlineWorker , pTileMap = tileMapWorker , pTileMapBlend = tileMapBlendWorker , pWireframe = wireframeWorker , pWireframeNoDepth = wireframeNoDepthWorker , pShadowCast = shadowCastWorker } allocateObservers :: RenderPasses -> PipelineWorkers -> ResourceT (Engine.StageRIO rs) PipelineObservers allocateObservers renderPasses Pipelines{..} = do evanwSdfExt <- External.newObserverGraphics forward pMSAA pEvanwSdf skyboxExt <- External.newObserverGraphics forward pMSAA pSkybox debugUVExt <- External.newObserverGraphics forward pMSAA pDebugUV debugTextureExt <- External.newObserverGraphics forward pMSAA pDebugTexture debugShadowExt <- External.newObserverGraphics forward pMSAA pDebugShadow depthOnlyExt <- External.newObserverGraphics forward pMSAA pDepthOnly litColoredExt <- External.newObserverGraphics forward pMSAA pLitColored litColoredBlendExt <- External.newObserverGraphics forward pMSAA pLitColoredBlend litMaterialExt <- External.newObserverGraphics forward pMSAA pLitMaterial litMaterialBlendExt <- External.newObserverGraphics forward pMSAA pLitMaterialBlend litTexturedExt <- External.newObserverGraphics forward pMSAA pLitTextured litTexturedBlendExt <- External.newObserverGraphics forward pMSAA pLitTexturedBlend line2dExt <- External.newObserverGraphics forward pMSAA pLine2d line2dNoDepthExt <- External.newObserverGraphics forward pMSAA pLine2dNoDepth unlitColoredExt <- External.newObserverGraphics forward pMSAA pUnlitColored unlitColoredNoDepthExt <- External.newObserverGraphics forward pMSAA pUnlitColoredNoDepth unlitTexturedExt <- External.newObserverGraphics forward pMSAA pUnlitTextured unlitTexturedBlendExt <- External.newObserverGraphics forward pMSAA pUnlitTexturedBlend spriteExt <- External.newObserverGraphics forward pMSAA pSprite spriteOutlineExt <- External.newObserverGraphics forward pMSAA pSpriteOutline tileMapExt <- External.newObserverGraphics forward pMSAA pTileMap tileMapBlendExt <- External.newObserverGraphics forward pMSAA pTileMapBlend wireframeExt <- External.newObserverGraphics forward pMSAA pWireframe wireframeNoDepthExt <- External.newObserverGraphics forward pMSAA pWireframeNoDepth shadowCastExt <- External.newObserverGraphics forward pMSAA pShadowCast pure Pipelines { pEvanwSdf = evanwSdfExt , pSkybox = skyboxExt , pDebugUV = debugUVExt , pDebugTexture = debugTextureExt , pDebugShadow = debugShadowExt , pDepthOnly = depthOnlyExt , pLitColored = litColoredExt , pLitColoredBlend = litColoredBlendExt , pLitMaterial = litMaterialExt , pLitMaterialBlend = litMaterialBlendExt , pLitTextured = litTexturedExt , pLitTexturedBlend = litTexturedBlendExt , pLine2d = line2dExt , pLine2dNoDepth = line2dNoDepthExt , pUnlitColored = unlitColoredExt , pUnlitColoredNoDepth = unlitColoredNoDepthExt , pUnlitTextured = unlitTexturedExt , pUnlitTexturedBlend = unlitTexturedBlendExt , pSprite = spriteExt , pSpriteOutline = spriteOutlineExt , pTileMap = tileMapExt , pTileMapBlend = tileMapBlendExt , pWireframe = wireframeExt , pWireframeNoDepth = wireframeNoDepthExt , pShadowCast = shadowCastExt , .. } where forward = rpForwardMsaa renderPasses observePipelines :: RenderPasses -> PipelineWorkers -> PipelineObservers -> Engine.StageFrameRIO rp p fr rs () observePipelines fRenderpass workers pipelines = do observe @EvanwSdf.Pipeline pEvanwSdf observe @Skybox.Pipeline pSkybox observe @Debug.Pipeline pDebugUV observe @Debug.Pipeline pDebugTexture observe @Debug.Pipeline pDebugShadow observe @DepthOnly.Pipeline pDepthOnly observe @LitColored.Pipeline pLitColored observe @LitColored.Pipeline pLitColoredBlend observe @LitTextured.Pipeline pLitTextured observe @LitTextured.Pipeline pLitTexturedBlend observe @LitMaterial.Pipeline pLitMaterial observe @LitMaterial.Pipeline pLitMaterialBlend observe @UnlitColored.Pipeline pUnlitColored observe @UnlitColored.Pipeline pUnlitColoredNoDepth observe @UnlitTextured.Pipeline pUnlitTextured observe @UnlitTextured.Pipeline pUnlitTexturedBlend observe @UnlitSprite.Pipeline pSprite observe @UnlitSprite.Pipeline pSpriteOutline observe @UnlitTileMap.Pipeline pTileMap observe @UnlitTileMap.Pipeline pTileMapBlend observe @UnlitColored.Pipeline pWireframe observe @UnlitColored.Pipeline pWireframeNoDepth External.observeGraphics (rpShadowPass fRenderpass) -- XXX: different RP here (pMSAA workers) (Tagged [unTagged $ pSceneBinds pipelines]) (pShadowCast workers) (pShadowCast pipelines) where observe :: forall p s vs is rps ps fr rs . ( p ~ Graphics.Pipeline s vs is , Shader.Specialization (Graphics.Specialization p) ) => (forall a . PipelinesF a -> a ^ p) -> Engine.StageFrameRIO rps ps fr rs () observe = External.observeField @PipelinesF @p (rpForwardMsaa fRenderpass) (pMSAA workers) (pSceneBinds pipelines) workers pipelines getSceneLayout :: PipelinesF f -> Tagged '[Scene] Vk.DescriptorSetLayout getSceneLayout = pSceneLayout getSunLayout :: Pipelines -> Tagged '[Sun] Vk.DescriptorSetLayout getSunLayout = pShadowLayout shaderDir :: FilePath shaderDir = "data" "shaders" "basic" stageSources :: Map Text Graphics.StageCode stageSources = [ ("evanw-sdf", EvanwSdf.stageCode) , ("skybox", Skybox.stageCode) , ("debug", Debug.stageCode) , ("depth-only", DepthOnly.stageCode) , ("lit-colored", LitColored.stageCode) , ("lit-material", LitMaterial.stageCode) , ("lit-textured", LitTextured.stageCode) , ("unlit-colored", UnlitColored.stageCode) , ("unlit-textured", UnlitTextured.stageCode) , ("line-2d", UnlitLine2d.stageCode) , ("sprite", UnlitSprite.stageCode) , ("tilemap", UnlitTileMap.stageCode) , ("shadow-cast", ShadowPipe.stageCode) ]