{-# LANGUAGE ImportQualifiedPost #-} {-# LANGUAGE BlockArguments #-} {-# LANGUAGE MonoLocalBinds #-} {-# LANGUAGE FlexibleContexts, UndecidableInstances #-} {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE StandaloneDeriving #-} {-# OPTIONS_GHC -Wall -fno-warn-tabs #-} module Gpu.Vulkan.CommandPool.Middle.Internal ( C(..), CreateInfo(..), create, destroy, reset ) where import Foreign.Ptr import Foreign.Marshal.Alloc import Foreign.Storable import Foreign.Storable.PeekPoke (WithPoked, withPoked, withPoked', withPtrS) import Data.TypeLevel.Maybe qualified as TMaybe import Data.TypeLevel.ParMaybe qualified as TPMaybe import Gpu.Vulkan.Exception.Middle.Internal import Gpu.Vulkan.Exception.Enum import Gpu.Vulkan.CommandPool.Enum import Gpu.Vulkan.AllocationCallbacks.Middle.Internal qualified as AllocationCallbacks import qualified Gpu.Vulkan.Device.Middle.Types as Device import qualified Gpu.Vulkan.QueueFamily.EnumManual as QueueFamily import qualified Gpu.Vulkan.CommandPool.Core as C data CreateInfo mn = CreateInfo { forall (mn :: Maybe (*)). CreateInfo mn -> M mn createInfoNext :: TMaybe.M mn, forall (mn :: Maybe (*)). CreateInfo mn -> CreateFlags createInfoFlags :: CreateFlags, forall (mn :: Maybe (*)). CreateInfo mn -> Index createInfoQueueFamilyIndex :: QueueFamily.Index } deriving instance Show (TMaybe.M mn) => Show (CreateInfo mn) createInfoToCore :: WithPoked (TMaybe.M mn) => CreateInfo mn -> (Ptr C.CreateInfo -> IO a) -> IO () createInfoToCore :: forall (mn :: Maybe (*)) a. WithPoked (M mn) => CreateInfo mn -> (Ptr CreateInfo -> IO a) -> IO () createInfoToCore CreateInfo { createInfoNext :: forall (mn :: Maybe (*)). CreateInfo mn -> M mn createInfoNext = M mn mnxt, createInfoFlags :: forall (mn :: Maybe (*)). CreateInfo mn -> CreateFlags createInfoFlags = CreateFlagBits Word32 flgs, createInfoQueueFamilyIndex :: forall (mn :: Maybe (*)). CreateInfo mn -> Index createInfoQueueFamilyIndex = QueueFamily.Index Word32 qfi } Ptr 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') -> CreateInfo -> (Ptr CreateInfo -> IO a) -> IO a forall a b. Pokable a => a -> (Ptr a -> IO b) -> IO b withPoked C.CreateInfo { createInfoSType :: () C.createInfoSType = (), createInfoPNext :: Ptr () C.createInfoPNext = Ptr () pnxt', createInfoFlags :: Word32 C.createInfoFlags = Word32 flgs, createInfoQueueFamilyIndex :: Word32 C.createInfoQueueFamilyIndex = Word32 qfi } Ptr CreateInfo -> IO a f newtype C = C C.C deriving Int -> C -> ShowS [C] -> ShowS C -> String (Int -> C -> ShowS) -> (C -> String) -> ([C] -> ShowS) -> Show C forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: Int -> C -> ShowS showsPrec :: Int -> C -> ShowS $cshow :: C -> String show :: C -> String $cshowList :: [C] -> ShowS showList :: [C] -> ShowS Show create :: WithPoked (TMaybe.M mn) => Device.D -> CreateInfo mn -> TPMaybe.M AllocationCallbacks.A mc -> IO C create :: forall (mn :: Maybe (*)) (mc :: Maybe (*)). WithPoked (M mn) => D -> CreateInfo mn -> M A mc -> IO C create (Device.D D dvc) CreateInfo mn ci M A mc mac = C -> C C (C -> C) -> IO C -> IO C forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> (Ptr C -> IO C) -> IO C forall a b. Storable a => (Ptr a -> IO b) -> IO b alloca \Ptr C pc -> do CreateInfo mn -> (Ptr CreateInfo -> IO ()) -> IO () forall (mn :: Maybe (*)) a. WithPoked (M mn) => CreateInfo mn -> (Ptr CreateInfo -> IO a) -> IO () createInfoToCore CreateInfo mn ci \Ptr CreateInfo pci -> M A mc -> (Ptr A -> IO ()) -> IO () forall (ma :: Maybe (*)) b. M A ma -> (Ptr A -> IO b) -> IO () AllocationCallbacks.mToCore M A mc mac \Ptr A pac -> Result -> IO () throwUnlessSuccess (Result -> IO ()) -> (Int32 -> Result) -> Int32 -> IO () forall b c a. (b -> c) -> (a -> b) -> a -> c . Int32 -> Result Result (Int32 -> IO ()) -> IO Int32 -> IO () forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< D -> Ptr CreateInfo -> Ptr A -> Ptr C -> IO Int32 C.create D dvc Ptr CreateInfo pci Ptr A pac Ptr C pc Ptr C -> IO C forall a. Storable a => Ptr a -> IO a peek Ptr C pc destroy :: Device.D -> C -> TPMaybe.M AllocationCallbacks.A md -> IO () destroy :: forall (md :: Maybe (*)). D -> C -> M A md -> IO () destroy (Device.D D dvc) (C C c) M A md mac = M A md -> (Ptr A -> IO ()) -> IO () forall (ma :: Maybe (*)) b. M A ma -> (Ptr A -> IO b) -> IO () AllocationCallbacks.mToCore M A md mac ((Ptr A -> IO ()) -> IO ()) -> (Ptr A -> IO ()) -> IO () forall a b. (a -> b) -> a -> b $ D -> C -> Ptr A -> IO () C.destroy D dvc C c reset :: Device.D -> C -> ResetFlags -> IO () reset :: D -> C -> ResetFlags -> IO () reset (Device.D D dv) (C C c) (ResetFlagBits Word32 fs) = D -> C -> Word32 -> IO () C.reset D dv C c Word32 fs