{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module Graphics.Vulkan.Marshal.Proc
( VulkanProc (..)
, vkGetInstanceProc, vkGetInstanceProcUnsafe, vkGetInstanceProcSafe
, vkLookupInstanceProc, vkLookupInstanceProcUnsafe, vkLookupInstanceProcSafe
, vkGetDeviceProc, vkGetDeviceProcUnsafe, vkGetDeviceProcSafe
, vkLookupDeviceProc, vkLookupDeviceProcUnsafe, vkLookupDeviceProcSafe
, vkGetProc, vkGetProcUnsafe, vkGetProcSafe
, vkLookupProc, vkLookupProcUnsafe, vkLookupProcSafe
, FunPtr, nullFunPtr
) where
import Control.Monad (when)
import Data.Void (Void)
import Foreign.C.String (CString, peekCString)
import Foreign.ForeignPtr (ForeignPtr, newForeignPtr,
withForeignPtr)
import Foreign.Marshal.Alloc (alloca)
import Foreign.Ptr (FunPtr, nullFunPtr, nullPtr)
import Foreign.Storable (peek)
import GHC.Ptr (Ptr (..))
import GHC.TypeLits (Symbol)
import System.IO.Unsafe (unsafePerformIO)
import Graphics.Vulkan.Types.Handles (VkDevice, VkInstance)
class VulkanProc (proc :: Symbol) where
type VkProcType proc
vkProcSymbol :: CString
unwrapVkProcPtrUnsafe :: FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrSafe :: FunPtr (VkProcType proc) -> VkProcType proc
vkGetInstanceProcUnsafe :: forall proc . VulkanProc proc
=> VkInstance -> IO (VkProcType proc)
vkGetInstanceProcUnsafe :: forall (proc :: Symbol).
VulkanProc proc =>
VkInstance -> IO (VkProcType proc)
vkGetInstanceProcUnsafe VkInstance
i
= forall (proc :: Symbol).
VulkanProc proc =>
FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrUnsafe @proc
(FunPtr (VkProcType proc) -> VkProcType proc)
-> IO (FunPtr (VkProcType proc)) -> IO (VkProcType proc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> VkInstance -> CString -> IO (FunPtr (VkProcType proc))
forall a. VkInstance -> CString -> IO (FunPtr a)
c'vkGetInstanceProcAddrUnsafe VkInstance
i (forall (proc :: Symbol). VulkanProc proc => CString
vkProcSymbol @proc)
{-# INLINE vkGetInstanceProcUnsafe #-}
vkLookupInstanceProcUnsafe :: forall proc . VulkanProc proc
=> VkInstance -> IO (Maybe (VkProcType proc))
vkLookupInstanceProcUnsafe :: forall (proc :: Symbol).
VulkanProc proc =>
VkInstance -> IO (Maybe (VkProcType proc))
vkLookupInstanceProcUnsafe VkInstance
i
= FunPtr (VkProcType proc) -> Maybe (VkProcType proc)
f (FunPtr (VkProcType proc) -> Maybe (VkProcType proc))
-> IO (FunPtr (VkProcType proc)) -> IO (Maybe (VkProcType proc))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> VkInstance -> CString -> IO (FunPtr (VkProcType proc))
forall a. VkInstance -> CString -> IO (FunPtr a)
c'vkGetInstanceProcAddrUnsafe VkInstance
i (forall (proc :: Symbol). VulkanProc proc => CString
vkProcSymbol @proc)
where
f :: FunPtr (VkProcType proc) -> Maybe (VkProcType proc)
f FunPtr (VkProcType proc)
p = if FunPtr (VkProcType proc)
p FunPtr (VkProcType proc) -> FunPtr (VkProcType proc) -> Bool
forall a. Eq a => a -> a -> Bool
== FunPtr (VkProcType proc)
forall a. FunPtr a
nullFunPtr then Maybe (VkProcType proc)
forall a. Maybe a
Nothing else VkProcType proc -> Maybe (VkProcType proc)
forall a. a -> Maybe a
Just (forall (proc :: Symbol).
VulkanProc proc =>
FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrUnsafe @proc FunPtr (VkProcType proc)
p)
{-# INLINE vkLookupInstanceProcUnsafe #-}
vkGetDeviceProcUnsafe :: forall proc . VulkanProc proc
=> VkDevice -> IO (VkProcType proc)
vkGetDeviceProcUnsafe :: forall (proc :: Symbol).
VulkanProc proc =>
VkDevice -> IO (VkProcType proc)
vkGetDeviceProcUnsafe VkDevice
i
= forall (proc :: Symbol).
VulkanProc proc =>
FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrUnsafe @proc
(FunPtr (VkProcType proc) -> VkProcType proc)
-> IO (FunPtr (VkProcType proc)) -> IO (VkProcType proc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> VkDevice -> CString -> IO (FunPtr (VkProcType proc))
forall a. VkDevice -> CString -> IO (FunPtr a)
c'vkGetDeviceProcAddrUnsafe VkDevice
i (forall (proc :: Symbol). VulkanProc proc => CString
vkProcSymbol @proc)
{-# INLINE vkGetDeviceProcUnsafe #-}
vkLookupDeviceProcUnsafe :: forall proc . VulkanProc proc
=> VkDevice -> IO (Maybe (VkProcType proc))
vkLookupDeviceProcUnsafe :: forall (proc :: Symbol).
VulkanProc proc =>
VkDevice -> IO (Maybe (VkProcType proc))
vkLookupDeviceProcUnsafe VkDevice
i
= FunPtr (VkProcType proc) -> Maybe (VkProcType proc)
f (FunPtr (VkProcType proc) -> Maybe (VkProcType proc))
-> IO (FunPtr (VkProcType proc)) -> IO (Maybe (VkProcType proc))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> VkDevice -> CString -> IO (FunPtr (VkProcType proc))
forall a. VkDevice -> CString -> IO (FunPtr a)
c'vkGetDeviceProcAddrUnsafe VkDevice
i (forall (proc :: Symbol). VulkanProc proc => CString
vkProcSymbol @proc)
where
f :: FunPtr (VkProcType proc) -> Maybe (VkProcType proc)
f FunPtr (VkProcType proc)
p = if FunPtr (VkProcType proc)
p FunPtr (VkProcType proc) -> FunPtr (VkProcType proc) -> Bool
forall a. Eq a => a -> a -> Bool
== FunPtr (VkProcType proc)
forall a. FunPtr a
nullFunPtr then Maybe (VkProcType proc)
forall a. Maybe a
Nothing else VkProcType proc -> Maybe (VkProcType proc)
forall a. a -> Maybe a
Just (forall (proc :: Symbol).
VulkanProc proc =>
FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrUnsafe @proc FunPtr (VkProcType proc)
p)
{-# INLINE vkLookupDeviceProcUnsafe #-}
vkGetProcUnsafe :: forall proc . VulkanProc proc => IO (VkProcType proc)
vkGetProcUnsafe :: forall (proc :: Symbol). VulkanProc proc => IO (VkProcType proc)
vkGetProcUnsafe = (Ptr CString -> IO (VkProcType proc)) -> IO (VkProcType proc)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CString -> IO (VkProcType proc)) -> IO (VkProcType proc))
-> (Ptr CString -> IO (VkProcType proc)) -> IO (VkProcType proc)
forall a b. (a -> b) -> a -> b
$ \Ptr CString
errPtr -> do
FunPtr (VkProcType proc)
fp <- ForeignPtr Void
-> (Ptr Void -> IO (FunPtr (VkProcType proc)))
-> IO (FunPtr (VkProcType proc))
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Void
_vkDlHandle ((Ptr Void -> IO (FunPtr (VkProcType proc)))
-> IO (FunPtr (VkProcType proc)))
-> (Ptr Void -> IO (FunPtr (VkProcType proc)))
-> IO (FunPtr (VkProcType proc))
forall a b. (a -> b) -> a -> b
$ \Ptr Void
h ->
Ptr Void -> CString -> Ptr CString -> IO (FunPtr (VkProcType proc))
forall a. Ptr Void -> CString -> Ptr CString -> IO (FunPtr a)
c'vkdll_dlsym Ptr Void
h (forall (proc :: Symbol). VulkanProc proc => CString
vkProcSymbol @proc) Ptr CString
errPtr
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (FunPtr (VkProcType proc)
fp FunPtr (VkProcType proc) -> FunPtr (VkProcType proc) -> Bool
forall a. Eq a => a -> a -> Bool
== FunPtr (VkProcType proc)
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ Ptr CString -> IO CString
forall a. Storable a => Ptr a -> IO a
peek Ptr CString
errPtr IO CString -> (CString -> IO String) -> IO String
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CString -> IO String
peekCString IO String -> (String -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> IO ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> IO ()) -> (String -> String) -> String -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(String
"An error happened while trying to load vulkan symbol dynamically: " String -> String -> String
forall a. [a] -> [a] -> [a]
++)
VkProcType proc -> IO (VkProcType proc)
forall (m :: * -> *) a. Monad m => a -> m a
return (VkProcType proc -> IO (VkProcType proc))
-> VkProcType proc -> IO (VkProcType proc)
forall a b. (a -> b) -> a -> b
$ forall (proc :: Symbol).
VulkanProc proc =>
FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrUnsafe @proc FunPtr (VkProcType proc)
fp
{-# INLINE vkGetProcUnsafe #-}
vkLookupProcUnsafe :: forall proc . VulkanProc proc => IO (Maybe (VkProcType proc))
vkLookupProcUnsafe :: forall (proc :: Symbol).
VulkanProc proc =>
IO (Maybe (VkProcType proc))
vkLookupProcUnsafe = (Ptr CString -> IO (Maybe (VkProcType proc)))
-> IO (Maybe (VkProcType proc))
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CString -> IO (Maybe (VkProcType proc)))
-> IO (Maybe (VkProcType proc)))
-> (Ptr CString -> IO (Maybe (VkProcType proc)))
-> IO (Maybe (VkProcType proc))
forall a b. (a -> b) -> a -> b
$ \Ptr CString
errPtr -> do
FunPtr (VkProcType proc)
fp <- ForeignPtr Void
-> (Ptr Void -> IO (FunPtr (VkProcType proc)))
-> IO (FunPtr (VkProcType proc))
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Void
_vkDlHandle ((Ptr Void -> IO (FunPtr (VkProcType proc)))
-> IO (FunPtr (VkProcType proc)))
-> (Ptr Void -> IO (FunPtr (VkProcType proc)))
-> IO (FunPtr (VkProcType proc))
forall a b. (a -> b) -> a -> b
$ \Ptr Void
h ->
Ptr Void -> CString -> Ptr CString -> IO (FunPtr (VkProcType proc))
forall a. Ptr Void -> CString -> Ptr CString -> IO (FunPtr a)
c'vkdll_dlsym Ptr Void
h (forall (proc :: Symbol). VulkanProc proc => CString
vkProcSymbol @proc) Ptr CString
errPtr
Maybe (VkProcType proc) -> IO (Maybe (VkProcType proc))
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (VkProcType proc) -> IO (Maybe (VkProcType proc)))
-> Maybe (VkProcType proc) -> IO (Maybe (VkProcType proc))
forall a b. (a -> b) -> a -> b
$ if FunPtr (VkProcType proc)
fp FunPtr (VkProcType proc) -> FunPtr (VkProcType proc) -> Bool
forall a. Eq a => a -> a -> Bool
== FunPtr (VkProcType proc)
forall a. FunPtr a
nullFunPtr then Maybe (VkProcType proc)
forall a. Maybe a
Nothing else VkProcType proc -> Maybe (VkProcType proc)
forall a. a -> Maybe a
Just (forall (proc :: Symbol).
VulkanProc proc =>
FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrUnsafe @proc FunPtr (VkProcType proc)
fp)
{-# INLINE vkLookupProcUnsafe #-}
vkGetInstanceProcSafe :: forall proc . VulkanProc proc
=> VkInstance -> IO (VkProcType proc)
vkGetInstanceProcSafe :: forall (proc :: Symbol).
VulkanProc proc =>
VkInstance -> IO (VkProcType proc)
vkGetInstanceProcSafe VkInstance
i
= forall (proc :: Symbol).
VulkanProc proc =>
FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrSafe @proc
(FunPtr (VkProcType proc) -> VkProcType proc)
-> IO (FunPtr (VkProcType proc)) -> IO (VkProcType proc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> VkInstance -> CString -> IO (FunPtr (VkProcType proc))
forall a. VkInstance -> CString -> IO (FunPtr a)
c'vkGetInstanceProcAddrSafe VkInstance
i (forall (proc :: Symbol). VulkanProc proc => CString
vkProcSymbol @proc)
{-# INLINE vkGetInstanceProcSafe #-}
vkLookupInstanceProcSafe :: forall proc . VulkanProc proc
=> VkInstance -> IO (Maybe (VkProcType proc))
vkLookupInstanceProcSafe :: forall (proc :: Symbol).
VulkanProc proc =>
VkInstance -> IO (Maybe (VkProcType proc))
vkLookupInstanceProcSafe VkInstance
i
= FunPtr (VkProcType proc) -> Maybe (VkProcType proc)
f (FunPtr (VkProcType proc) -> Maybe (VkProcType proc))
-> IO (FunPtr (VkProcType proc)) -> IO (Maybe (VkProcType proc))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> VkInstance -> CString -> IO (FunPtr (VkProcType proc))
forall a. VkInstance -> CString -> IO (FunPtr a)
c'vkGetInstanceProcAddrSafe VkInstance
i (forall (proc :: Symbol). VulkanProc proc => CString
vkProcSymbol @proc)
where
f :: FunPtr (VkProcType proc) -> Maybe (VkProcType proc)
f FunPtr (VkProcType proc)
p = if FunPtr (VkProcType proc)
p FunPtr (VkProcType proc) -> FunPtr (VkProcType proc) -> Bool
forall a. Eq a => a -> a -> Bool
== FunPtr (VkProcType proc)
forall a. FunPtr a
nullFunPtr then Maybe (VkProcType proc)
forall a. Maybe a
Nothing else VkProcType proc -> Maybe (VkProcType proc)
forall a. a -> Maybe a
Just (forall (proc :: Symbol).
VulkanProc proc =>
FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrSafe @proc FunPtr (VkProcType proc)
p)
{-# INLINE vkLookupInstanceProcSafe #-}
vkGetDeviceProcSafe :: forall proc . VulkanProc proc
=> VkDevice -> IO (VkProcType proc)
vkGetDeviceProcSafe :: forall (proc :: Symbol).
VulkanProc proc =>
VkDevice -> IO (VkProcType proc)
vkGetDeviceProcSafe VkDevice
i
= forall (proc :: Symbol).
VulkanProc proc =>
FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrSafe @proc
(FunPtr (VkProcType proc) -> VkProcType proc)
-> IO (FunPtr (VkProcType proc)) -> IO (VkProcType proc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> VkDevice -> CString -> IO (FunPtr (VkProcType proc))
forall a. VkDevice -> CString -> IO (FunPtr a)
c'vkGetDeviceProcAddrSafe VkDevice
i (forall (proc :: Symbol). VulkanProc proc => CString
vkProcSymbol @proc)
{-# INLINE vkGetDeviceProcSafe #-}
vkLookupDeviceProcSafe :: forall proc . VulkanProc proc
=> VkDevice -> IO (Maybe (VkProcType proc))
vkLookupDeviceProcSafe :: forall (proc :: Symbol).
VulkanProc proc =>
VkDevice -> IO (Maybe (VkProcType proc))
vkLookupDeviceProcSafe VkDevice
i
= FunPtr (VkProcType proc) -> Maybe (VkProcType proc)
f (FunPtr (VkProcType proc) -> Maybe (VkProcType proc))
-> IO (FunPtr (VkProcType proc)) -> IO (Maybe (VkProcType proc))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> VkDevice -> CString -> IO (FunPtr (VkProcType proc))
forall a. VkDevice -> CString -> IO (FunPtr a)
c'vkGetDeviceProcAddrSafe VkDevice
i (forall (proc :: Symbol). VulkanProc proc => CString
vkProcSymbol @proc)
where
f :: FunPtr (VkProcType proc) -> Maybe (VkProcType proc)
f FunPtr (VkProcType proc)
p = if FunPtr (VkProcType proc)
p FunPtr (VkProcType proc) -> FunPtr (VkProcType proc) -> Bool
forall a. Eq a => a -> a -> Bool
== FunPtr (VkProcType proc)
forall a. FunPtr a
nullFunPtr then Maybe (VkProcType proc)
forall a. Maybe a
Nothing else VkProcType proc -> Maybe (VkProcType proc)
forall a. a -> Maybe a
Just (forall (proc :: Symbol).
VulkanProc proc =>
FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrSafe @proc FunPtr (VkProcType proc)
p)
{-# INLINE vkLookupDeviceProcSafe #-}
vkGetProcSafe :: forall proc . VulkanProc proc => IO (VkProcType proc)
vkGetProcSafe :: forall (proc :: Symbol). VulkanProc proc => IO (VkProcType proc)
vkGetProcSafe = (Ptr CString -> IO (VkProcType proc)) -> IO (VkProcType proc)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CString -> IO (VkProcType proc)) -> IO (VkProcType proc))
-> (Ptr CString -> IO (VkProcType proc)) -> IO (VkProcType proc)
forall a b. (a -> b) -> a -> b
$ \Ptr CString
errPtr -> do
FunPtr (VkProcType proc)
fp <- ForeignPtr Void
-> (Ptr Void -> IO (FunPtr (VkProcType proc)))
-> IO (FunPtr (VkProcType proc))
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Void
_vkDlHandle ((Ptr Void -> IO (FunPtr (VkProcType proc)))
-> IO (FunPtr (VkProcType proc)))
-> (Ptr Void -> IO (FunPtr (VkProcType proc)))
-> IO (FunPtr (VkProcType proc))
forall a b. (a -> b) -> a -> b
$ \Ptr Void
h ->
Ptr Void -> CString -> Ptr CString -> IO (FunPtr (VkProcType proc))
forall a. Ptr Void -> CString -> Ptr CString -> IO (FunPtr a)
c'vkdll_dlsym Ptr Void
h (forall (proc :: Symbol). VulkanProc proc => CString
vkProcSymbol @proc) Ptr CString
errPtr
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (FunPtr (VkProcType proc)
fp FunPtr (VkProcType proc) -> FunPtr (VkProcType proc) -> Bool
forall a. Eq a => a -> a -> Bool
== FunPtr (VkProcType proc)
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ Ptr CString -> IO CString
forall a. Storable a => Ptr a -> IO a
peek Ptr CString
errPtr IO CString -> (CString -> IO String) -> IO String
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CString -> IO String
peekCString IO String -> (String -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> IO ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> IO ()) -> (String -> String) -> String -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(String
"An error happened while trying to load vulkan symbol dynamically: " String -> String -> String
forall a. [a] -> [a] -> [a]
++)
VkProcType proc -> IO (VkProcType proc)
forall (m :: * -> *) a. Monad m => a -> m a
return (VkProcType proc -> IO (VkProcType proc))
-> VkProcType proc -> IO (VkProcType proc)
forall a b. (a -> b) -> a -> b
$ forall (proc :: Symbol).
VulkanProc proc =>
FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrSafe @proc FunPtr (VkProcType proc)
fp
{-# INLINE vkGetProcSafe #-}
vkLookupProcSafe :: forall proc . VulkanProc proc => IO (Maybe (VkProcType proc))
vkLookupProcSafe :: forall (proc :: Symbol).
VulkanProc proc =>
IO (Maybe (VkProcType proc))
vkLookupProcSafe = (Ptr CString -> IO (Maybe (VkProcType proc)))
-> IO (Maybe (VkProcType proc))
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CString -> IO (Maybe (VkProcType proc)))
-> IO (Maybe (VkProcType proc)))
-> (Ptr CString -> IO (Maybe (VkProcType proc)))
-> IO (Maybe (VkProcType proc))
forall a b. (a -> b) -> a -> b
$ \Ptr CString
errPtr -> do
FunPtr (VkProcType proc)
fp <- ForeignPtr Void
-> (Ptr Void -> IO (FunPtr (VkProcType proc)))
-> IO (FunPtr (VkProcType proc))
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Void
_vkDlHandle ((Ptr Void -> IO (FunPtr (VkProcType proc)))
-> IO (FunPtr (VkProcType proc)))
-> (Ptr Void -> IO (FunPtr (VkProcType proc)))
-> IO (FunPtr (VkProcType proc))
forall a b. (a -> b) -> a -> b
$ \Ptr Void
h ->
Ptr Void -> CString -> Ptr CString -> IO (FunPtr (VkProcType proc))
forall a. Ptr Void -> CString -> Ptr CString -> IO (FunPtr a)
c'vkdll_dlsym Ptr Void
h (forall (proc :: Symbol). VulkanProc proc => CString
vkProcSymbol @proc) Ptr CString
errPtr
Maybe (VkProcType proc) -> IO (Maybe (VkProcType proc))
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (VkProcType proc) -> IO (Maybe (VkProcType proc)))
-> Maybe (VkProcType proc) -> IO (Maybe (VkProcType proc))
forall a b. (a -> b) -> a -> b
$ if FunPtr (VkProcType proc)
fp FunPtr (VkProcType proc) -> FunPtr (VkProcType proc) -> Bool
forall a. Eq a => a -> a -> Bool
== FunPtr (VkProcType proc)
forall a. FunPtr a
nullFunPtr then Maybe (VkProcType proc)
forall a. Maybe a
Nothing else VkProcType proc -> Maybe (VkProcType proc)
forall a. a -> Maybe a
Just (forall (proc :: Symbol).
VulkanProc proc =>
FunPtr (VkProcType proc) -> VkProcType proc
unwrapVkProcPtrSafe @proc FunPtr (VkProcType proc)
fp)
{-# INLINE vkLookupProcSafe #-}
vkGetInstanceProc :: forall proc . VulkanProc proc
=> VkInstance -> IO (VkProcType proc)
vkGetInstanceProc :: forall (proc :: Symbol).
VulkanProc proc =>
VkInstance -> IO (VkProcType proc)
vkGetInstanceProc =
#ifdef UNSAFE_FFI_DEFAULT
vkGetInstanceProcUnsafe @proc
#else
forall (proc :: Symbol).
VulkanProc proc =>
VkInstance -> IO (VkProcType proc)
vkGetInstanceProcSafe @proc
#endif
{-# INLINE vkGetInstanceProc #-}
vkLookupInstanceProc :: forall proc . VulkanProc proc
=> VkInstance -> IO (Maybe (VkProcType proc))
vkLookupInstanceProc :: forall (proc :: Symbol).
VulkanProc proc =>
VkInstance -> IO (Maybe (VkProcType proc))
vkLookupInstanceProc =
#ifdef UNSAFE_FFI_DEFAULT
vkLookupInstanceProcUnsafe @proc
#else
forall (proc :: Symbol).
VulkanProc proc =>
VkInstance -> IO (Maybe (VkProcType proc))
vkLookupInstanceProcSafe @proc
#endif
{-# INLINE vkLookupInstanceProc #-}
vkGetDeviceProc :: forall proc . VulkanProc proc
=> VkDevice -> IO (VkProcType proc)
vkGetDeviceProc :: forall (proc :: Symbol).
VulkanProc proc =>
VkDevice -> IO (VkProcType proc)
vkGetDeviceProc =
#ifdef UNSAFE_FFI_DEFAULT
vkGetDeviceProcUnsafe @proc
#else
forall (proc :: Symbol).
VulkanProc proc =>
VkDevice -> IO (VkProcType proc)
vkGetDeviceProcSafe @proc
#endif
{-# INLINE vkGetDeviceProc #-}
vkLookupDeviceProc :: forall proc . VulkanProc proc
=> VkDevice -> IO (Maybe (VkProcType proc))
vkLookupDeviceProc :: forall (proc :: Symbol).
VulkanProc proc =>
VkDevice -> IO (Maybe (VkProcType proc))
vkLookupDeviceProc =
#ifdef UNSAFE_FFI_DEFAULT
vkLookupDeviceProcUnsafe @proc
#else
forall (proc :: Symbol).
VulkanProc proc =>
VkDevice -> IO (Maybe (VkProcType proc))
vkLookupDeviceProcSafe @proc
#endif
{-# INLINE vkLookupDeviceProc #-}
vkGetProc :: forall proc . VulkanProc proc => IO (VkProcType proc)
vkGetProc :: forall (proc :: Symbol). VulkanProc proc => IO (VkProcType proc)
vkGetProc =
#ifdef UNSAFE_FFI_DEFAULT
vkGetProcUnsafe @proc
#else
forall (proc :: Symbol). VulkanProc proc => IO (VkProcType proc)
vkGetProcSafe @proc
#endif
{-# INLINE vkGetProc #-}
vkLookupProc :: forall proc . VulkanProc proc => IO (Maybe (VkProcType proc))
vkLookupProc :: forall (proc :: Symbol).
VulkanProc proc =>
IO (Maybe (VkProcType proc))
vkLookupProc =
#ifdef UNSAFE_FFI_DEFAULT
vkLookupProcUnsafe @proc
#else
forall (proc :: Symbol).
VulkanProc proc =>
IO (Maybe (VkProcType proc))
vkLookupProcSafe @proc
#endif
{-# INLINE vkLookupProc #-}
#ifdef VK_NO_PROTOTYPES
c'vkGetInstanceProcAddrSafe :: VkInstance -> CString -> IO (FunPtr a)
c'vkGetInstanceProcAddrSafe :: forall a. VkInstance -> CString -> IO (FunPtr a)
c'vkGetInstanceProcAddrSafe = (FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
forall a.
(FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
c'vkGetInstanceProcAddr' FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
forall a.
FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
unwrap'vkGetInstanceProcAddrSafe
c'vkGetInstanceProcAddrUnsafe :: VkInstance -> CString -> IO (FunPtr a)
c'vkGetInstanceProcAddrUnsafe :: forall a. VkInstance -> CString -> IO (FunPtr a)
c'vkGetInstanceProcAddrUnsafe = (FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
forall a.
(FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
c'vkGetInstanceProcAddr' FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
forall a.
FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
unwrap'vkGetInstanceProcAddrUnsafe
c'vkGetDeviceProcAddrSafe :: VkDevice -> CString -> IO (FunPtr a)
c'vkGetDeviceProcAddrSafe :: forall a. VkDevice -> CString -> IO (FunPtr a)
c'vkGetDeviceProcAddrSafe = (FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
forall a.
(FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
c'vkGetDeviceProcAddr' FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
forall a.
FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
unwrap'vkGetDeviceProcAddrSafe
c'vkGetDeviceProcAddrUnsafe :: VkDevice -> CString -> IO (FunPtr a)
c'vkGetDeviceProcAddrUnsafe :: forall a. VkDevice -> CString -> IO (FunPtr a)
c'vkGetDeviceProcAddrUnsafe = (FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
forall a.
(FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
c'vkGetDeviceProcAddr' FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
forall a.
FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
unwrap'vkGetDeviceProcAddrUnsafe
c'vkGetInstanceProcAddr'
:: ( FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
)
-> VkInstance -> CString -> IO (FunPtr a)
c'vkGetInstanceProcAddr' :: forall a.
(FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
c'vkGetInstanceProcAddr' FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
k = IO (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
forall a. IO a -> a
unsafePerformIO (IO (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a))
-> IO (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance
-> CString
-> IO (FunPtr a)
forall a b. (a -> b) -> a -> b
$ (Ptr CString -> IO (VkInstance -> CString -> IO (FunPtr a)))
-> IO (VkInstance -> CString -> IO (FunPtr a))
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CString -> IO (VkInstance -> CString -> IO (FunPtr a)))
-> IO (VkInstance -> CString -> IO (FunPtr a)))
-> (Ptr CString -> IO (VkInstance -> CString -> IO (FunPtr a)))
-> IO (VkInstance -> CString -> IO (FunPtr a))
forall a b. (a -> b) -> a -> b
$ \Ptr CString
errPtr -> do
FunPtr (VkInstance -> CString -> IO (FunPtr a))
fp <- ForeignPtr Void
-> (Ptr Void
-> IO (FunPtr (VkInstance -> CString -> IO (FunPtr a))))
-> IO (FunPtr (VkInstance -> CString -> IO (FunPtr a)))
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Void
_vkDlHandle ((Ptr Void -> IO (FunPtr (VkInstance -> CString -> IO (FunPtr a))))
-> IO (FunPtr (VkInstance -> CString -> IO (FunPtr a))))
-> (Ptr Void
-> IO (FunPtr (VkInstance -> CString -> IO (FunPtr a))))
-> IO (FunPtr (VkInstance -> CString -> IO (FunPtr a)))
forall a b. (a -> b) -> a -> b
$ \Ptr Void
h ->
Ptr Void
-> CString
-> Ptr CString
-> IO (FunPtr (VkInstance -> CString -> IO (FunPtr a)))
forall a. Ptr Void -> CString -> Ptr CString -> IO (FunPtr a)
c'vkdll_dlsym Ptr Void
h (Addr# -> CString
forall a. Addr# -> Ptr a
Ptr Addr#
"vkGetInstanceProcAddr"#) Ptr CString
errPtr
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (FunPtr (VkInstance -> CString -> IO (FunPtr a))
fp FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> FunPtr (VkInstance -> CString -> IO (FunPtr a)) -> Bool
forall a. Eq a => a -> a -> Bool
== FunPtr (VkInstance -> CString -> IO (FunPtr a))
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
Ptr CString -> IO CString
forall a. Storable a => Ptr a -> IO a
peek Ptr CString
errPtr IO CString -> (CString -> IO String) -> IO String
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CString -> IO String
peekCString IO String -> (String -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> IO ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> IO ()) -> (String -> String) -> String -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(String
"Could not load 'vkGetInstanceProcAddr' C function from vulkan library dynamically: " String -> String -> String
forall a. [a] -> [a] -> [a]
++)
(VkInstance -> CString -> IO (FunPtr a))
-> IO (VkInstance -> CString -> IO (FunPtr a))
forall (m :: * -> *) a. Monad m => a -> m a
return ((VkInstance -> CString -> IO (FunPtr a))
-> IO (VkInstance -> CString -> IO (FunPtr a)))
-> (VkInstance -> CString -> IO (FunPtr a))
-> IO (VkInstance -> CString -> IO (FunPtr a))
forall a b. (a -> b) -> a -> b
$ FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
k FunPtr (VkInstance -> CString -> IO (FunPtr a))
fp
c'vkGetDeviceProcAddr'
:: ( FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
)
-> VkDevice -> CString -> IO (FunPtr a)
c'vkGetDeviceProcAddr' :: forall a.
(FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
c'vkGetDeviceProcAddr' FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
k = IO (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
forall a. IO a -> a
unsafePerformIO (IO (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a))
-> IO (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice
-> CString
-> IO (FunPtr a)
forall a b. (a -> b) -> a -> b
$ (Ptr CString -> IO (VkDevice -> CString -> IO (FunPtr a)))
-> IO (VkDevice -> CString -> IO (FunPtr a))
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CString -> IO (VkDevice -> CString -> IO (FunPtr a)))
-> IO (VkDevice -> CString -> IO (FunPtr a)))
-> (Ptr CString -> IO (VkDevice -> CString -> IO (FunPtr a)))
-> IO (VkDevice -> CString -> IO (FunPtr a))
forall a b. (a -> b) -> a -> b
$ \Ptr CString
errPtr -> do
FunPtr (VkDevice -> CString -> IO (FunPtr a))
fp <- ForeignPtr Void
-> (Ptr Void -> IO (FunPtr (VkDevice -> CString -> IO (FunPtr a))))
-> IO (FunPtr (VkDevice -> CString -> IO (FunPtr a)))
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Void
_vkDlHandle ((Ptr Void -> IO (FunPtr (VkDevice -> CString -> IO (FunPtr a))))
-> IO (FunPtr (VkDevice -> CString -> IO (FunPtr a))))
-> (Ptr Void -> IO (FunPtr (VkDevice -> CString -> IO (FunPtr a))))
-> IO (FunPtr (VkDevice -> CString -> IO (FunPtr a)))
forall a b. (a -> b) -> a -> b
$ \Ptr Void
h ->
Ptr Void
-> CString
-> Ptr CString
-> IO (FunPtr (VkDevice -> CString -> IO (FunPtr a)))
forall a. Ptr Void -> CString -> Ptr CString -> IO (FunPtr a)
c'vkdll_dlsym Ptr Void
h (Addr# -> CString
forall a. Addr# -> Ptr a
Ptr Addr#
"vkGetDeviceProcAddr"#) Ptr CString
errPtr
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (FunPtr (VkDevice -> CString -> IO (FunPtr a))
fp FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> FunPtr (VkDevice -> CString -> IO (FunPtr a)) -> Bool
forall a. Eq a => a -> a -> Bool
== FunPtr (VkDevice -> CString -> IO (FunPtr a))
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ Ptr CString -> IO CString
forall a. Storable a => Ptr a -> IO a
peek Ptr CString
errPtr IO CString -> (CString -> IO String) -> IO String
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CString -> IO String
peekCString IO String -> (String -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> IO ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> IO ()) -> (String -> String) -> String -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(String
"Could not load 'vkGetDeviceProcAddr' C function from vulkan library dynamically: " String -> String -> String
forall a. [a] -> [a] -> [a]
++)
(VkDevice -> CString -> IO (FunPtr a))
-> IO (VkDevice -> CString -> IO (FunPtr a))
forall (m :: * -> *) a. Monad m => a -> m a
return ((VkDevice -> CString -> IO (FunPtr a))
-> IO (VkDevice -> CString -> IO (FunPtr a)))
-> (VkDevice -> CString -> IO (FunPtr a))
-> IO (VkDevice -> CString -> IO (FunPtr a))
forall a b. (a -> b) -> a -> b
$ FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
k FunPtr (VkDevice -> CString -> IO (FunPtr a))
fp
foreign import ccall safe "dynamic"
unwrap'vkGetInstanceProcAddrSafe
:: FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
foreign import ccall safe "dynamic"
unwrap'vkGetDeviceProcAddrSafe
:: FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
foreign import ccall unsafe "dynamic"
unwrap'vkGetInstanceProcAddrUnsafe
:: FunPtr (VkInstance -> CString -> IO (FunPtr a))
-> VkInstance -> CString -> IO (FunPtr a)
foreign import ccall unsafe "dynamic"
unwrap'vkGetDeviceProcAddrUnsafe
:: FunPtr (VkDevice -> CString -> IO (FunPtr a))
-> VkDevice -> CString -> IO (FunPtr a)
#else
foreign import ccall safe "vkGetInstanceProcAddr"
c'vkGetInstanceProcAddrSafe :: VkInstance -> CString -> IO (FunPtr a)
foreign import ccall safe "vkGetDeviceProcAddr"
c'vkGetDeviceProcAddrSafe :: VkDevice -> CString -> IO (FunPtr a)
foreign import ccall unsafe "vkGetInstanceProcAddr"
c'vkGetInstanceProcAddrUnsafe :: VkInstance -> CString -> IO (FunPtr a)
foreign import ccall unsafe "vkGetDeviceProcAddr"
c'vkGetDeviceProcAddrUnsafe :: VkDevice -> CString -> IO (FunPtr a)
#endif
foreign import ccall safe "_vkdll_dlinit"
c'vkdll_dlinit :: Ptr CString -> IO (Ptr Void)
foreign import ccall safe "_vkdll_dlsym"
c'vkdll_dlsym :: Ptr Void -> CString -> Ptr CString -> IO (FunPtr a)
foreign import ccall safe "&_vkdll_dlclose"
p'vk_dlclose :: FunPtr (Ptr Void -> IO ())
_vkDlHandle :: ForeignPtr Void
_vkDlHandle :: ForeignPtr Void
_vkDlHandle = IO (ForeignPtr Void) -> ForeignPtr Void
forall a. IO a -> a
unsafePerformIO (IO (ForeignPtr Void) -> ForeignPtr Void)
-> IO (ForeignPtr Void) -> ForeignPtr Void
forall a b. (a -> b) -> a -> b
$ (Ptr CString -> IO (ForeignPtr Void)) -> IO (ForeignPtr Void)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CString -> IO (ForeignPtr Void)) -> IO (ForeignPtr Void))
-> (Ptr CString -> IO (ForeignPtr Void)) -> IO (ForeignPtr Void)
forall a b. (a -> b) -> a -> b
$ \Ptr CString
errPtr -> do
Ptr Void
handle <- Ptr CString -> IO (Ptr Void)
c'vkdll_dlinit Ptr CString
errPtr
if Ptr Void
handle Ptr Void -> Ptr Void -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr Void
forall a. Ptr a
nullPtr
then
Ptr CString -> IO CString
forall a. Storable a => Ptr a -> IO a
peek Ptr CString
errPtr IO CString -> (CString -> IO String) -> IO String
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CString -> IO String
peekCString IO String
-> (String -> IO (ForeignPtr Void)) -> IO (ForeignPtr Void)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> IO (ForeignPtr Void)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> IO (ForeignPtr Void))
-> (String -> String) -> String -> IO (ForeignPtr Void)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(String
"An error happened while trying to load vulkan library dynamically: " String -> String -> String
forall a. [a] -> [a] -> [a]
++)
else
FinalizerPtr Void -> Ptr Void -> IO (ForeignPtr Void)
forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FinalizerPtr Void
p'vk_dlclose Ptr Void
handle
{-# NOINLINE _vkDlHandle #-}