{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE FlexibleContexts, UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.DescriptorSetLayout.BindingFlags.Middle.Internal (
	CreateInfo(..) ) where

import Foreign.Ptr
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Storable
import Foreign.Storable.PeekPoke
import Data.TypeLevel.Maybe qualified as TMaybe
import Gpu.Vulkan.Descriptor.Enum qualified as Descriptor
import Gpu.Vulkan.DescriptorSetLayout.BindingFlags.Core qualified as C

data CreateInfo mn = CreateInfo {
	forall (mn :: Maybe (*)). CreateInfo mn -> M mn
createInfoNext :: TMaybe.M mn,
	forall (mn :: Maybe (*)). CreateInfo mn -> [BindingFlags]
createInfoBindingFlagsList :: [Descriptor.BindingFlags] }

createInfoToCore :: WithPoked (TMaybe.M mn) =>
	CreateInfo mn -> (C.CreateInfo -> IO a) -> IO ()
createInfoToCore :: forall (mn :: Maybe (*)) a.
WithPoked (M mn) =>
CreateInfo mn -> (CreateInfo -> IO a) -> IO ()
createInfoToCore CreateInfo {
	createInfoNext :: forall (mn :: Maybe (*)). CreateInfo mn -> M mn
createInfoNext = M mn
mnxt,
	createInfoBindingFlagsList :: forall (mn :: Maybe (*)). CreateInfo mn -> [BindingFlags]
createInfoBindingFlagsList = [BindingFlags]
bfsl } CreateInfo -> IO a
f =
	M mn -> (forall s. PtrS s (M mn) -> IO ()) -> IO ()
forall a b.
WithPoked a =>
a -> (forall s. PtrS s a -> IO b) -> IO b
forall b. M mn -> (forall s. PtrS s (M mn) -> IO b) -> IO b
withPoked' M mn
mnxt \PtrS s (M mn)
pnxt -> PtrS s (M mn) -> (Ptr (M mn) -> IO a) -> IO ()
forall s a b. PtrS s a -> (Ptr a -> IO b) -> IO ()
withPtrS PtrS s (M mn)
pnxt \(Ptr (M mn) -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr -> Ptr ()
pnxt') ->
	let	bfsc :: Int
bfsc = [BindingFlags] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [BindingFlags]
bfsl in
	Int -> (Ptr Word32 -> IO a) -> IO a
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
bfsc \Ptr Word32
pbfs ->
	Ptr Word32 -> [Word32] -> IO ()
forall a. Storable a => Ptr a -> [a] -> IO ()
pokeArray Ptr Word32
pbfs (BindingFlags -> Word32
Descriptor.unBindingFlagBits (BindingFlags -> Word32) -> [BindingFlags] -> [Word32]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [BindingFlags]
bfsl) IO () -> IO a -> IO a
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
	CreateInfo -> IO a
f C.CreateInfo {
		createInfoSType :: ()
C.createInfoSType = (),
		createInfoPNext :: Ptr ()
C.createInfoPNext = Ptr ()
pnxt',
		createInfoBindingCount :: Word32
C.createInfoBindingCount = Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
bfsc,
		createInfoPBindingFlags :: Ptr Word32
C.createInfoPBindingFlags = Ptr Word32
pbfs }

instance Sizable (CreateInfo mn) where
	sizeOf' :: Int
sizeOf' = forall a. Storable a => a -> Int
sizeOf @C.CreateInfo CreateInfo
forall a. HasCallStack => a
undefined
	alignment' :: Int
alignment' = forall a. Storable a => a -> Int
alignment @C.CreateInfo CreateInfo
forall a. HasCallStack => a
undefined

instance WithPoked (TMaybe.M mn) => WithPoked (CreateInfo mn) where
	withPoked' :: forall b.
CreateInfo mn -> (forall s. PtrS s (CreateInfo mn) -> IO b) -> IO b
withPoked' CreateInfo mn
ci forall s. PtrS s (CreateInfo mn) -> IO b
f = (Ptr CreateInfo -> IO b) -> IO b
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca \Ptr CreateInfo
pcci -> do
		CreateInfo mn -> (CreateInfo -> IO ()) -> IO ()
forall (mn :: Maybe (*)) a.
WithPoked (M mn) =>
CreateInfo mn -> (CreateInfo -> IO a) -> IO ()
createInfoToCore CreateInfo mn
ci \CreateInfo
cci -> Ptr CreateInfo -> CreateInfo -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr CreateInfo
pcci CreateInfo
cci
		PtrS Any (CreateInfo mn) -> IO b
forall s. PtrS s (CreateInfo mn) -> IO b
f (PtrS Any (CreateInfo mn) -> IO b)
-> (Ptr (CreateInfo mn) -> PtrS Any (CreateInfo mn))
-> Ptr (CreateInfo mn)
-> IO b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr (CreateInfo mn) -> PtrS Any (CreateInfo mn)
forall a s. Ptr a -> PtrS s a
ptrS (Ptr (CreateInfo mn) -> IO b) -> Ptr (CreateInfo mn) -> IO b
forall a b. (a -> b) -> a -> b
$ Ptr CreateInfo -> Ptr (CreateInfo mn)
forall a b. Ptr a -> Ptr b
castPtr Ptr CreateInfo
pcci