{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE ScopedTypeVariables, TypeApplications #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures, TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses, AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances #-}
{-# LANGUAGE PatternSynonyms #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
module Gpu.Vulkan.PushConstant.Internal (
Layout(..), Range(..),
RangeListToMiddle(..)
) where
import Foreign.Storable.HeteroList
import Data.Kind
import Gpu.Vulkan.TypeEnum qualified as T
import Gpu.Vulkan.PushConstant.Middle qualified as M
data Layout = Layout [Type] [Range]
data Range = Range [T.ShaderStageFlagBits] [Type]
class RangeListToMiddle (whole :: [Type]) (ranges :: [Range]) where
rangeListToMiddle :: [M.Range]
instance RangeListToMiddle whole '[] where rangeListToMiddle :: [Range]
rangeListToMiddle = []
instance (RangeToMiddle whole range, RangeListToMiddle whole ranges) =>
RangeListToMiddle whole (range ': ranges) where
rangeListToMiddle :: [Range]
rangeListToMiddle =
forall (whole :: [*]) (range :: Range).
RangeToMiddle whole range =>
Range
rangeToMiddle @whole @range Range -> [Range] -> [Range]
forall a. a -> [a] -> [a]
: forall (whole :: [*]) (ranges :: [Range]).
RangeListToMiddle whole ranges =>
[Range]
rangeListToMiddle @whole @ranges
class RangeToMiddle (whole :: [Type]) (range :: Range) where
rangeToMiddle :: M.Range
instance (T.ShaderStageFlagBitsListToValue sss, InfixOffsetSize part whole) =>
RangeToMiddle whole ('Range sss part) where
rangeToMiddle :: Range
rangeToMiddle = M.Range {
rangeStageFlags :: ShaderStageFlags
M.rangeStageFlags = forall (ts :: [ShaderStageFlagBits]).
ShaderStageFlagBitsListToValue ts =>
ShaderStageFlags
T.shaderStageFlagBitsListToValue @sss,
rangeOffset :: Word32
M.rangeOffset = Offset -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Offset
offt,
rangeSize :: Word32
M.rangeSize = Offset -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Offset
sz }
where
(Offset
offt, Offset
sz) = forall (part :: [*]) (whole :: [*]).
InfixOffsetSize part whole =>
(Offset, Offset)
infixOffsetSize @part @whole