gpu-vulkan-0.1.0.137: src/Gpu/Vulkan/DescriptorSetLayout/UpdateDynamicLengths.hs
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE ScopedTypeVariables, TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses, AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances #-}
{-# LANGUAGE PatternSynonyms #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
module Gpu.Vulkan.DescriptorSetLayout.UpdateDynamicLengths (
-- * UPDATE DYNAMIC LENGTHS
UpdateDynamicLength(..) ) where
import Gpu.Vulkan.Object qualified as VObj
import Gpu.Vulkan.Object.Base qualified as KObj
import Data.HeteroParList qualified as HeteroParList
import Data.HeteroParList (pattern (:**))
import qualified Gpu.Vulkan.DescriptorSetLayout.Type as Layout
class VObj.OnlyDynamicLengths objs => UpdateDynamicLength bts objs where
updateDynamicLength ::
HeteroParList.PL
(HeteroParList.PL KObj.Length)
(Layout.BindingTypeListBufferOnlyDynamics bts) ->
HeteroParList.PL KObj.Length
(VObj.OnlyDynamics objs) ->
HeteroParList.PL
(HeteroParList.PL KObj.Length)
(Layout.BindingTypeListBufferOnlyDynamics bts)
instance UpdateDynamicLength _bts '[] where updateDynamicLength x _ = x
instance UpdateDynamicLength bts (o ': os) =>
UpdateDynamicLength ('Layout.Buffer '[] ': bts) (o ': os) where
updateDynamicLength (HeteroParList.Nil :** lnss) lns =
HeteroParList.Nil :** updateDynamicLength @bts @(o ': os) lnss lns
instance (UpdateDynamicLengthPrefix os os', VObj.OnlyDynamicLengths os) =>
UpdateDynamicLength
('Layout.Buffer (VObj.Static algn 'Nothing ot t ': os') ': bts)
(VObj.Static algn ('Just _nm) ot t ': os) where
updateDynamicLength (lns' :** lnss) lns =
updateDynamicLengthPrefix @os @os' lns' lns :** lnss
instance (UpdateDynamicLengthPrefix os os', VObj.OnlyDynamicLengths os) =>
UpdateDynamicLength
('Layout.Buffer (VObj.Static algn ('Just _nm) ot t ': os') ': bts)
(VObj.Static algn 'Nothing ot t ': os) where
updateDynamicLength (lns' :** lnss) lns =
updateDynamicLengthPrefix @os @os' lns' lns :** lnss
instance (UpdateDynamicLengthPrefix os os', VObj.OnlyDynamicLengths os) =>
UpdateDynamicLength
('Layout.Buffer (VObj.Dynamic n algn 'Nothing ot t ': os') ': bts)
(VObj.Dynamic n algn ('Just _nm) ot t ': os) where
updateDynamicLength ((_ln :** lns') :** lnss) (ln :** lns) =
(KObj.renameLength ln :** updateDynamicLengthPrefix @os @os' lns' lns) :** lnss
instance (UpdateDynamicLengthPrefix os os', VObj.OnlyDynamicLengths os) =>
UpdateDynamicLength
('Layout.Buffer (VObj.Dynamic n algn ('Just _nm) ot t ': os') ': bts)
(VObj.Dynamic n algn 'Nothing ot t ': os) where
updateDynamicLength ((_ln :** lns') :** lnss) (ln :** lns) =
(KObj.renameLength ln :** updateDynamicLengthPrefix @os @os' lns' lns) :** lnss
instance (UpdateDynamicLengthPrefix os os', VObj.OnlyDynamicLengths os) =>
UpdateDynamicLength
('Layout.Buffer (VObj.Static_ o ': os') ': bts)
(VObj.Static_ o ': os) where
updateDynamicLength (lns' :** lnss) lns =
updateDynamicLengthPrefix @os @os' lns' lns :** lnss
instance (UpdateDynamicLengthPrefix os os', VObj.OnlyDynamicLengths os) =>
UpdateDynamicLength
('Layout.Buffer ('VObj.Dynamic n o ': os') ': bts)
('VObj.Dynamic n o ': os) where
updateDynamicLength ((_ln :** lns') :** lnss) (ln :** lns) =
(ln :** updateDynamicLengthPrefix @os @os' lns' lns) :** lnss
instance {-# OVERLAPPABLE #-}
UpdateDynamicLength
('Layout.Buffer os' ': bts) (oo ': os) =>
UpdateDynamicLength
('Layout.Buffer (VObj.Static_ o ': os') ': bts) (oo ': os) where
updateDynamicLength lnss lns =
updateDynamicLength
@('Layout.Buffer os' ': bts) @(oo ': os) lnss lns
instance {-# OVERLAPPABLE #-}
UpdateDynamicLength
('Layout.Buffer os' ': bts) (oo ': os) =>
UpdateDynamicLength
('Layout.Buffer ('VObj.Dynamic n o ': os') ': bts) (oo ': os) where
updateDynamicLength ((ln :** lns') :** lnss) lns = let
ls' :** lss = updateDynamicLength
@('Layout.Buffer os' ': bts) @(oo ': os) (lns' :** lnss) lns in
(ln :** ls') :** lss
class UpdateDynamicLengthPrefix (objs :: [VObj.O]) (objs' :: [VObj.O]) where
updateDynamicLengthPrefix ::
HeteroParList.PL KObj.Length (VObj.OnlyDynamics objs') ->
HeteroParList.PL KObj.Length (VObj.OnlyDynamics objs) ->
HeteroParList.PL KObj.Length (VObj.OnlyDynamics objs')
instance UpdateDynamicLengthPrefix '[] objs where
updateDynamicLengthPrefix lns _ = lns
instance UpdateDynamicLengthPrefix os os' =>
UpdateDynamicLengthPrefix
(VObj.Static algn 'Nothing ot t ': os)
(VObj.Static algn ('Just _nm) ot t ': os') where
updateDynamicLengthPrefix lns' lns =
updateDynamicLengthPrefix @os @os' lns' lns
instance UpdateDynamicLengthPrefix os os' =>
UpdateDynamicLengthPrefix
(VObj.Static algn ('Just _nm) ot t ': os)
(VObj.Static algn 'Nothing ot t ': os') where
updateDynamicLengthPrefix lns' lns =
updateDynamicLengthPrefix @os @os' lns' lns
instance UpdateDynamicLengthPrefix os os' =>
UpdateDynamicLengthPrefix
(VObj.Dynamic n algn 'Nothing ot t ': os)
(VObj.Dynamic n algn ('Just _nm) ot t ': os') where
updateDynamicLengthPrefix (_ln :** lns') (ln :** lns) =
KObj.renameLength ln :** updateDynamicLengthPrefix @os @os' lns' lns
instance UpdateDynamicLengthPrefix os os' =>
UpdateDynamicLengthPrefix
(VObj.Dynamic n algn ('Just _nm) ot t ': os)
(VObj.Dynamic n algn 'Nothing ot t ': os') where
updateDynamicLengthPrefix (_ln :** lns') (ln :** lns) =
KObj.renameLength ln :** updateDynamicLengthPrefix @os @os' lns' lns
instance UpdateDynamicLengthPrefix os os' =>
UpdateDynamicLengthPrefix
(VObj.Static_ o : os) (VObj.Static_ o : os') where
updateDynamicLengthPrefix lns' lns =
updateDynamicLengthPrefix @os @os' lns' lns
instance UpdateDynamicLengthPrefix os os' =>
UpdateDynamicLengthPrefix
('VObj.Dynamic n o : os) ('VObj.Dynamic n o : os') where
updateDynamicLengthPrefix (_ln :** lns') (ln :** lns) =
ln :** updateDynamicLengthPrefix @os @os' lns' lns