gpu-vulkan-0.1.0.137: src/Gpu/Vulkan/DescriptorSet/BindingAndArrayElem.hs
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE ScopedTypeVariables, TypeApplications #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures, TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses, AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs -fno-warn-redundant-constraints #-}
module Gpu.Vulkan.DescriptorSet.BindingAndArrayElem (
-- * IMAGE
BindingAndArrayElemImage(..),
BindingAndArrayElemImageWithImmutableSampler(..),
-- * BUFFER VIEW
BindingAndArrayElemBufferView(..) ) where
import GHC.TypeLits
import Data.Kind
import Data.TypeLevel.List qualified as TList
import Data.TypeLevel.Tuple.MapIndex qualified as TMapIndex
import Gpu.Vulkan.TypeEnum qualified as T
import Gpu.Vulkan.DescriptorSetLayout.Type qualified as Lyt
-- * IMAGE
-- ** Image
class BindingAndArrayElemImage
(lbts :: [Lyt.BindingType])
(iargs :: [(Symbol, T.Format)]) (i :: Nat) where
bindingAndArrayElemImage :: Integral n => n -> n -> (n, n)
instance TList.IsPrefixOf iargs liargs =>
BindingAndArrayElemImage
('Lyt.Image (iarg ': liargs) : lbts) (iarg ': iargs) 0 where
bindingAndArrayElemImage b ae = (b, ae)
instance {-# OVERLAPPABLE #-}
BindingAndArrayElemImage
('Lyt.Image liargs ': lbts) (iarg ': iargs) (i - 1) =>
BindingAndArrayElemImage
('Lyt.Image (iarg ': liargs) ': lbts) (iarg ': iargs) i where
bindingAndArrayElemImage b ae = bindingAndArrayElemImage
@('Lyt.Image liargs ': lbts) @(iarg ': iargs) @(i - 1) b (ae + 1)
instance {-# OVERLAPPABLE #-}
BindingAndArrayElemImage ('Lyt.Image liargs : lbts) iargs i =>
BindingAndArrayElemImage
('Lyt.Image (liarg ': liargs) ': lbts) iargs i where
bindingAndArrayElemImage b a = bindingAndArrayElemImage
@('Lyt.Image liargs : lbts) @iargs @i b (a + 1)
instance {-# OVERLAPPABLE #-}
BindingAndArrayElemImage lbts iargs i =>
BindingAndArrayElemImage (bt ': lbts) iargs i where
bindingAndArrayElemImage b _ =
bindingAndArrayElemImage @lbts @iargs @i (b + 1) 0
-- ** Image With Immutable Sampler
class BindingAndArrayElemImageWithImmutableSampler
(lbts :: [Lyt.BindingType])
(iargs :: [(Symbol, T.Format)]) (i :: Nat) where
bindingAndArrayElemImageWithImmutableSampler :: Integral n => n -> n -> (n, n)
instance TList.IsPrefixOf iargs (TMapIndex.M0'1_3 liargs) =>
BindingAndArrayElemImageWithImmutableSampler
('Lyt.ImageSampler ('(nm, fmt, ss) ': liargs) : lbts) ('(nm, fmt) ': iargs) 0 where
bindingAndArrayElemImageWithImmutableSampler b ae = (b, ae)
instance {-# OVERLAPPABLE #-}
BindingAndArrayElemImageWithImmutableSampler
('Lyt.ImageSampler liargs ': lbts) ('(nm, fmt) ': iargs) (i - 1) =>
BindingAndArrayElemImageWithImmutableSampler
('Lyt.ImageSampler ('(nm, fmt, ss) ': liargs) ': lbts) ('(nm, fmt) ': iargs) i where
bindingAndArrayElemImageWithImmutableSampler b ae =
bindingAndArrayElemImageWithImmutableSampler
@('Lyt.ImageSampler liargs ': lbts) @('(nm, fmt) ': iargs)
@(i - 1) b (ae + 1)
instance {-# OVERLAPPABLE #-}
BindingAndArrayElemImageWithImmutableSampler ('Lyt.ImageSampler liargs : lbts) iargs i =>
BindingAndArrayElemImageWithImmutableSampler
('Lyt.ImageSampler (liarg ': liargs) ': lbts) iargs i where
bindingAndArrayElemImageWithImmutableSampler b a = bindingAndArrayElemImageWithImmutableSampler
@('Lyt.ImageSampler liargs : lbts) @iargs @i b (a + 1)
instance {-# OVERLAPPABLE #-}
BindingAndArrayElemImageWithImmutableSampler lbts iargs i =>
BindingAndArrayElemImageWithImmutableSampler (bt ': lbts) iargs i where
bindingAndArrayElemImageWithImmutableSampler b _ =
bindingAndArrayElemImageWithImmutableSampler @lbts @iargs @i (b + 1) 0
-- * BUFFER VIEW
class BindingAndArrayElemBufferView
(bt :: [Lyt.BindingType]) (bvargs :: [(Symbol, Type)]) (i :: Nat) where
bindingAndArrayElemBufferView :: Integral n => n -> n -> (n, n)
instance TList.IsPrefixOf bvargs lbvargs => BindingAndArrayElemBufferView
('Lyt.BufferView (bvarg ': lbvargs) ': lbts)
(bvarg ': bvargs) 0 where
bindingAndArrayElemBufferView b a = (b, a)
instance {-# OVERLAPPABLE #-}
BindingAndArrayElemBufferView
('Lyt.BufferView lbvargs ': lbts) (bvarg ': bvargs) (i - 1) =>
BindingAndArrayElemBufferView
('Lyt.BufferView (bvarg ': lbvargs) ': lbts)
(bvarg ': bvargs) i where
bindingAndArrayElemBufferView b a = bindingAndArrayElemBufferView
@('Lyt.BufferView lbvargs ': lbts) @(bvarg ': bvargs) @(i - 1)
b a
instance {-# OVERLAPPABLE #-} BindingAndArrayElemBufferView
('Lyt.BufferView lbvargs ': lbts) bvargs i =>
BindingAndArrayElemBufferView
('Lyt.BufferView (bvarg ': lbvargs) ': lbts) bvargs i where
bindingAndArrayElemBufferView b a = bindingAndArrayElemBufferView
@('Lyt.BufferView lbvargs ': lbts) @bvargs @i b (a + 1)
instance {-# OVERLAPPABLE #-} BindingAndArrayElemBufferView lbts bvargs i =>
BindingAndArrayElemBufferView
(bt ': lbts) bvargs i where
bindingAndArrayElemBufferView b _a =
bindingAndArrayElemBufferView @lbts @bvargs @i (b + 1) 0