keid-render-basic-0.1.12.0: src/Render/Font/Msdf/Pipeline.hs
{-# LANGUAGE OverloadedLists #-}
module Render.Font.Msdf.Pipeline
( Config
, config
, Pipeline
, allocate
, Specialization(..)
, Mode(..)
, defaultSpecialization
, stageCode
, stageSpirv
) 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.Shader qualified as Shader
import Engine.Vulkan.Types (DsLayoutBindings, HasVulkan, HasRenderPass(..))
import Render.Code (compileVert, compileFrag)
import Render.DescSets.Set0 (Scene)
import Render.Font.Msdf.Code qualified as Code
import Render.Font.Msdf.Model qualified as Model
type Pipeline = Graphics.Pipeline '[Scene] () Model.InstanceAttrs
type Config = Graphics.Configure Pipeline
type instance Graphics.Specialization Pipeline = Specialization
data Specialization = Specialization
{ mode :: Mode
, srgb :: Bool
} deriving (Eq, Ord, Show)
defaultSpecialization :: Specialization
defaultSpecialization = Specialization
{ mode = MTSDF
, srgb = False
}
data Mode
= HardMask
| SoftMask
| SDF
| PSDF
| MSDF
| MTSDF
deriving (Eq, Ord, Show, Enum, Bounded)
instance Shader.Specialization Specialization where
specializationData Specialization{..} =
[ fromIntegral (fromEnum mode)
, Shader.packConstData srgb
]
allocate
:: ( HasVulkan env
, HasRenderPass renderpass
)
=> Specialization
-> Vk.SampleCountFlagBits
-> Tagged Scene DsLayoutBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
allocate spec multisample tset0 = do
fmap snd . Graphics.allocate
Nothing
multisample
(config spec tset0)
config :: Specialization -> Tagged Scene DsLayoutBindings -> Config
config spec (Tagged set0) = Graphics.baseConfig
{ Graphics.cDescLayouts = Tagged @'[Scene] [set0]
, Graphics.cStages = stageSpirv
, Graphics.cVertexInput = Graphics.vertexInput @Pipeline
, Graphics.cDepthTest = False
, Graphics.cDepthWrite = False
, Graphics.cBlend = True
, Graphics.cCull = Vk.CULL_MODE_NONE
, Graphics.cSpecialization = spec
}
stageCode :: Graphics.StageCode
stageCode = Graphics.basicStages Code.vert Code.frag
stageSpirv :: Graphics.StageSpirv
stageSpirv = Graphics.basicStages vertSpirv fragSpirv
vertSpirv :: ByteString
vertSpirv = $(compileVert Code.vert)
fragSpirv :: ByteString
fragSpirv = $(compileFrag Code.frag)