{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.CommandPool (

	-- * CREATE

	create, reset, C, M.CreateInfo(..),

	-- * ENUM

	module Gpu.Vulkan.CommandPool.Enum

	) where

import Foreign.Storable.PeekPoke
import Control.Exception
import Data.TypeLevel.Maybe qualified as TMaybe
import Data.TypeLevel.ParMaybe qualified as TPMaybe
import Data.TypeLevel.Tuple.Uncurry

import Gpu.Vulkan.CommandPool.Type

import qualified Gpu.Vulkan.AllocationCallbacks as AllocationCallbacks
import qualified Gpu.Vulkan.AllocationCallbacks.Type as AllocationCallbacks
import qualified Gpu.Vulkan.Device.Type as Device
import qualified Gpu.Vulkan.CommandPool.Middle as M
import qualified Gpu.Vulkan.CommandPool.Enum as Enum
import Gpu.Vulkan.CommandPool.Enum

create :: (WithPoked (TMaybe.M mn), AllocationCallbacks.ToMiddle ma) =>
	Device.D sd -> M.CreateInfo mn ->
	TPMaybe.M (U2 AllocationCallbacks.A) ma ->
	(forall s . C s -> IO a) -> IO a
create :: forall (mn :: Maybe (*)) (ma :: Maybe (*, *)) sd a.
(WithPoked (M mn), ToMiddle ma) =>
D sd
-> CreateInfo mn -> M (U2 A) ma -> (forall s. C s -> IO a) -> IO a
create (Device.D D
dvc) CreateInfo mn
ci
	(M (U2 A) ma -> M A (Snd ma)
forall (msa :: Maybe (*, *)).
ToMiddle msa =>
M (U2 A) msa -> M A (Snd msa)
AllocationCallbacks.toMiddle -> M A (Snd ma)
macc) forall s. C s -> IO a
f =
	IO C -> (C -> IO ()) -> (C -> IO a) -> IO a
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (D -> CreateInfo mn -> M A (Snd ma) -> IO C
forall (mn :: Maybe (*)) (mc :: Maybe (*)).
WithPoked (M mn) =>
D -> CreateInfo mn -> M A mc -> IO C
M.create D
dvc CreateInfo mn
ci M A (Snd ma)
macc) (\C
c -> D -> C -> M A (Snd ma) -> IO ()
forall (md :: Maybe (*)). D -> C -> M A md -> IO ()
M.destroy D
dvc C
c M A (Snd ma)
macc) (C Any -> IO a
forall s. C s -> IO a
f (C Any -> IO a) -> (C -> C Any) -> C -> IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. C -> C Any
forall s. C -> C s
C)

reset :: Device.D sd -> C s -> Enum.ResetFlags -> IO ()
reset :: forall sd s. D sd -> C s -> ResetFlags -> IO ()
reset (Device.D D
dv) (C C
c) ResetFlags
fs = D -> C -> ResetFlags -> IO ()
M.reset D
dv C
c ResetFlags
fs