{-# language CPP #-}
module Vulkan.Core11.DeviceInitialization (enumerateInstanceVersion) where
import Vulkan.Internal.Utils (traceAroundEvent)
import Control.Exception.Base (bracket)
import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Foreign.Marshal.Alloc (callocBytes)
import Foreign.Marshal.Alloc (free)
import GHC.Base (when)
import GHC.IO (throwIO)
import Foreign.Ptr (castFunPtr)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (nullPtr)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (evalContT)
import Control.Monad.IO.Class (MonadIO)
import Foreign.Storable (Storable(peek))
import GHC.IO.Exception (IOErrorType(..))
import GHC.IO.Exception (IOException(..))
import Foreign.Ptr (FunPtr)
import Foreign.Ptr (Ptr)
import GHC.Ptr (Ptr(Ptr))
import Data.Word (Word32)
import Control.Monad.Trans.Cont (ContT(..))
import Vulkan.Dynamic (getInstanceProcAddr')
import Vulkan.NamedType ((:::))
import Vulkan.Core10.Enums.Result (Result)
import Vulkan.Core10.Enums.Result (Result(..))
import Vulkan.Exception (VulkanException(..))
import Vulkan.Core10.Enums.Result (Result(SUCCESS))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
unsafe
#endif
"dynamic" mkVkEnumerateInstanceVersion
:: FunPtr (Ptr Word32 -> IO Result) -> Ptr Word32 -> IO Result
enumerateInstanceVersion :: forall io
. (MonadIO io)
=> io (("apiVersion" ::: Word32))
enumerateInstanceVersion :: forall (io :: * -> *). MonadIO io => io ("apiVersion" ::: Word32)
enumerateInstanceVersion = IO ("apiVersion" ::: Word32) -> io ("apiVersion" ::: Word32)
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO ("apiVersion" ::: Word32) -> io ("apiVersion" ::: Word32))
-> (ContT ("apiVersion" ::: Word32) IO ("apiVersion" ::: Word32)
-> IO ("apiVersion" ::: Word32))
-> ContT ("apiVersion" ::: Word32) IO ("apiVersion" ::: Word32)
-> io ("apiVersion" ::: Word32)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT ("apiVersion" ::: Word32) IO ("apiVersion" ::: Word32)
-> IO ("apiVersion" ::: Word32)
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT ("apiVersion" ::: Word32) IO ("apiVersion" ::: Word32)
-> io ("apiVersion" ::: Word32))
-> ContT ("apiVersion" ::: Word32) IO ("apiVersion" ::: Word32)
-> io ("apiVersion" ::: Word32)
forall a b. (a -> b) -> a -> b
$ do
vkEnumerateInstanceVersionPtr <- IO (FunPtr (Ptr ("apiVersion" ::: Word32) -> IO Result))
-> ContT
("apiVersion" ::: Word32)
IO
(FunPtr (Ptr ("apiVersion" ::: Word32) -> IO Result))
forall (m :: * -> *) a.
Monad m =>
m a -> ContT ("apiVersion" ::: Word32) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO (FunPtr (Ptr ("apiVersion" ::: Word32) -> IO Result))
-> ContT
("apiVersion" ::: Word32)
IO
(FunPtr (Ptr ("apiVersion" ::: Word32) -> IO Result)))
-> IO (FunPtr (Ptr ("apiVersion" ::: Word32) -> IO Result))
-> ContT
("apiVersion" ::: Word32)
IO
(FunPtr (Ptr ("apiVersion" ::: Word32) -> IO Result))
forall a b. (a -> b) -> a -> b
$ forall a b. FunPtr a -> FunPtr b
castFunPtr @_ @(("pApiVersion" ::: Ptr Word32) -> IO Result) (FunPtr FN_vkVoidFunction
-> FunPtr (Ptr ("apiVersion" ::: Word32) -> IO Result))
-> IO (FunPtr FN_vkVoidFunction)
-> IO (FunPtr (Ptr ("apiVersion" ::: Word32) -> IO Result))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr Instance_T
-> ("pName" ::: Ptr CChar) -> IO (FunPtr FN_vkVoidFunction)
getInstanceProcAddr' Ptr Instance_T
forall a. Ptr a
nullPtr (Addr# -> "pName" ::: Ptr CChar
forall a. Addr# -> Ptr a
Ptr Addr#
"vkEnumerateInstanceVersion"#)
lift $ unless (vkEnumerateInstanceVersionPtr /= nullFunPtr) $
throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkEnumerateInstanceVersion is null" Nothing Nothing
let vkEnumerateInstanceVersion' = FunPtr (Ptr ("apiVersion" ::: Word32) -> IO Result)
-> Ptr ("apiVersion" ::: Word32) -> IO Result
mkVkEnumerateInstanceVersion FunPtr (Ptr ("apiVersion" ::: Word32) -> IO Result)
vkEnumerateInstanceVersionPtr
pPApiVersion <- ContT $ bracket (callocBytes @Word32 4) free
r <- lift $ traceAroundEvent "vkEnumerateInstanceVersion" (vkEnumerateInstanceVersion'
(pPApiVersion))
lift $ when (r < SUCCESS) (throwIO (VulkanException r))
pApiVersion <- lift $ peek @Word32 pPApiVersion
pure $ (pApiVersion)