{-# language CPP #-}
module Vulkan.Core10.ExtensionDiscovery ( enumerateInstanceExtensionProperties
, enumerateDeviceExtensionProperties
, ExtensionProperties(..)
) where
import Vulkan.CStruct.Utils (FixedArray)
import Vulkan.Internal.Utils (traceAroundEvent)
import Control.Exception.Base (bracket)
import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Foreign.Marshal.Alloc (allocaBytes)
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 Foreign.Ptr (plusPtr)
import Data.ByteString (packCString)
import Data.ByteString (useAsCString)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (evalContT)
import Data.Vector (generateM)
import Foreign.C.Types (CChar(..))
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Zero (Zero(..))
import Control.Monad.IO.Class (MonadIO)
import Data.Typeable (Typeable)
import Foreign.C.Types (CChar)
import Foreign.Storable (Storable)
import Foreign.Storable (Storable(peek))
import Foreign.Storable (Storable(poke))
import qualified Foreign.Storable (Storable(..))
import GHC.Generics (Generic)
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 Data.ByteString (ByteString)
import Data.Kind (Type)
import Control.Monad.Trans.Cont (ContT(..))
import Data.Vector (Vector)
import Vulkan.CStruct.Utils (advancePtrBytes)
import Vulkan.Dynamic (getInstanceProcAddr')
import Vulkan.CStruct.Utils (lowerArrayPtr)
import Vulkan.CStruct.Utils (pokeFixedLengthNullTerminatedByteString)
import Vulkan.NamedType ((:::))
import Vulkan.Dynamic (InstanceCmds(pVkEnumerateDeviceExtensionProperties))
import Vulkan.Core10.APIConstants (MAX_EXTENSION_NAME_SIZE)
import Vulkan.Core10.Handles (PhysicalDevice)
import Vulkan.Core10.Handles (PhysicalDevice(..))
import Vulkan.Core10.Handles (PhysicalDevice(PhysicalDevice))
import Vulkan.Core10.Handles (PhysicalDevice_T)
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" mkVkEnumerateInstanceExtensionProperties
:: FunPtr (Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result) -> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result
enumerateInstanceExtensionProperties :: forall io
. (MonadIO io)
=>
("layerName" ::: Maybe ByteString)
-> io (Result, ("properties" ::: Vector ExtensionProperties))
enumerateInstanceExtensionProperties :: forall (io :: * -> *).
MonadIO io =>
("layerName" ::: Maybe ByteString)
-> io (Result, "properties" ::: Vector ExtensionProperties)
enumerateInstanceExtensionProperties "layerName" ::: Maybe ByteString
layerName = IO (Result, "properties" ::: Vector ExtensionProperties)
-> io (Result, "properties" ::: Vector ExtensionProperties)
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Result, "properties" ::: Vector ExtensionProperties)
-> io (Result, "properties" ::: Vector ExtensionProperties))
-> (ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Result, "properties" ::: Vector ExtensionProperties)
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Result, "properties" ::: Vector ExtensionProperties)
-> io (Result, "properties" ::: Vector ExtensionProperties)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Result, "properties" ::: Vector ExtensionProperties)
-> IO (Result, "properties" ::: Vector ExtensionProperties)
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Result, "properties" ::: Vector ExtensionProperties)
-> io (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Result, "properties" ::: Vector ExtensionProperties)
-> io (Result, "properties" ::: Vector ExtensionProperties)
forall a b. (a -> b) -> a -> b
$ do
vkEnumerateInstanceExtensionPropertiesPtr <- IO
(FunPtr
(Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(FunPtr
(Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result))
forall (m :: * -> *) a.
Monad m =>
m a
-> ContT (Result, "properties" ::: Vector ExtensionProperties) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO
(FunPtr
(Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(FunPtr
(Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result)))
-> IO
(FunPtr
(Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(FunPtr
(Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result))
forall a b. (a -> b) -> a -> b
$ forall a b. FunPtr a -> FunPtr b
castFunPtr @_ @(("pLayerName" ::: Ptr CChar) -> ("pPropertyCount" ::: Ptr Word32) -> ("pProperties" ::: Ptr ExtensionProperties) -> IO Result) (FunPtr FN_vkVoidFunction
-> FunPtr
(Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result))
-> IO (FunPtr FN_vkVoidFunction)
-> IO
(FunPtr
(Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr Instance_T -> Ptr CChar -> IO (FunPtr FN_vkVoidFunction)
getInstanceProcAddr' Ptr Instance_T
forall a. Ptr a
nullPtr (Addr# -> Ptr CChar
forall a. Addr# -> Ptr a
Ptr Addr#
"vkEnumerateInstanceExtensionProperties"#)
lift $ unless (vkEnumerateInstanceExtensionPropertiesPtr /= nullFunPtr) $
throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkEnumerateInstanceExtensionProperties is null" Nothing Nothing
let vkEnumerateInstanceExtensionProperties' = FunPtr
(Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result)
-> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result
mkVkEnumerateInstanceExtensionProperties FunPtr
(Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result)
vkEnumerateInstanceExtensionPropertiesPtr
pLayerName <- case (layerName) of
"layerName" ::: Maybe ByteString
Nothing -> Ptr CChar
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Ptr CChar)
forall a.
a
-> ContT (Result, "properties" ::: Vector ExtensionProperties) IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ptr CChar
forall a. Ptr a
nullPtr
Just ByteString
j -> ((Ptr CChar
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Ptr CChar)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr CChar
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Ptr CChar))
-> ((Ptr CChar
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Ptr CChar)
forall a b. (a -> b) -> a -> b
$ ByteString
-> (Ptr CChar
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties)
forall a. ByteString -> (Ptr CChar -> IO a) -> IO a
useAsCString (ByteString
j)
pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
r <- lift $ traceAroundEvent "vkEnumerateInstanceExtensionProperties" (vkEnumerateInstanceExtensionProperties'
pLayerName
(pPPropertyCount)
(nullPtr))
lift $ when (r < SUCCESS) (throwIO (VulkanException r))
pPropertyCount <- lift $ peek @Word32 pPPropertyCount
pPProperties <- ContT $ bracket (callocBytes @ExtensionProperties ((fromIntegral (pPropertyCount)) * 260)) free
_ <- traverse (\Int
i -> ((() -> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties) IO ()
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((() -> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties) IO ())
-> ((()
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties) IO ()
forall a b. (a -> b) -> a -> b
$ Ptr ExtensionProperties
-> IO (Result, "properties" ::: Vector ExtensionProperties)
-> IO (Result, "properties" ::: Vector ExtensionProperties)
forall b. Ptr ExtensionProperties -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> IO b -> IO b
pokeZeroCStruct (Ptr ExtensionProperties
pPProperties Ptr ExtensionProperties -> Int -> Ptr ExtensionProperties
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
260) :: Ptr ExtensionProperties) (IO (Result, "properties" ::: Vector ExtensionProperties)
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ((()
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> (() -> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((() -> IO (Result, "properties" ::: Vector ExtensionProperties))
-> () -> IO (Result, "properties" ::: Vector ExtensionProperties)
forall a b. (a -> b) -> a -> b
$ ())) [0..(fromIntegral (pPropertyCount)) - 1]
r' <- lift $ traceAroundEvent "vkEnumerateInstanceExtensionProperties" (vkEnumerateInstanceExtensionProperties'
pLayerName
(pPPropertyCount)
((pPProperties)))
lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\Int
i -> forall a. FromCStruct a => Ptr a -> IO a
peekCStruct @ExtensionProperties (((Ptr ExtensionProperties
pPProperties) Ptr ExtensionProperties -> Int -> Ptr ExtensionProperties
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (Int
260 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr ExtensionProperties)))
pure $ ((r'), pProperties')
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
unsafe
#endif
"dynamic" mkVkEnumerateDeviceExtensionProperties
:: FunPtr (Ptr PhysicalDevice_T -> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result) -> Ptr PhysicalDevice_T -> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result
enumerateDeviceExtensionProperties :: forall io
. (MonadIO io)
=>
PhysicalDevice
->
("layerName" ::: Maybe ByteString)
-> io (Result, ("properties" ::: Vector ExtensionProperties))
enumerateDeviceExtensionProperties :: forall (io :: * -> *).
MonadIO io =>
PhysicalDevice
-> ("layerName" ::: Maybe ByteString)
-> io (Result, "properties" ::: Vector ExtensionProperties)
enumerateDeviceExtensionProperties PhysicalDevice
physicalDevice
"layerName" ::: Maybe ByteString
layerName = IO (Result, "properties" ::: Vector ExtensionProperties)
-> io (Result, "properties" ::: Vector ExtensionProperties)
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Result, "properties" ::: Vector ExtensionProperties)
-> io (Result, "properties" ::: Vector ExtensionProperties))
-> (ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Result, "properties" ::: Vector ExtensionProperties)
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Result, "properties" ::: Vector ExtensionProperties)
-> io (Result, "properties" ::: Vector ExtensionProperties)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Result, "properties" ::: Vector ExtensionProperties)
-> IO (Result, "properties" ::: Vector ExtensionProperties)
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Result, "properties" ::: Vector ExtensionProperties)
-> io (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Result, "properties" ::: Vector ExtensionProperties)
-> io (Result, "properties" ::: Vector ExtensionProperties)
forall a b. (a -> b) -> a -> b
$ do
let vkEnumerateDeviceExtensionPropertiesPtr :: FunPtr
(Ptr PhysicalDevice_T
-> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result)
vkEnumerateDeviceExtensionPropertiesPtr = InstanceCmds
-> FunPtr
(Ptr PhysicalDevice_T
-> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result)
pVkEnumerateDeviceExtensionProperties (case PhysicalDevice
physicalDevice of PhysicalDevice{InstanceCmds
instanceCmds :: InstanceCmds
instanceCmds :: PhysicalDevice -> InstanceCmds
instanceCmds} -> InstanceCmds
instanceCmds)
FN_vkVoidFunction
-> ContT
(Result, "properties" ::: Vector ExtensionProperties) IO ()
forall (m :: * -> *) a.
Monad m =>
m a
-> ContT (Result, "properties" ::: Vector ExtensionProperties) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (FN_vkVoidFunction
-> ContT
(Result, "properties" ::: Vector ExtensionProperties) IO ())
-> FN_vkVoidFunction
-> ContT
(Result, "properties" ::: Vector ExtensionProperties) IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> FN_vkVoidFunction -> FN_vkVoidFunction
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
(Ptr PhysicalDevice_T
-> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result)
vkEnumerateDeviceExtensionPropertiesPtr FunPtr
(Ptr PhysicalDevice_T
-> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result)
-> FunPtr
(Ptr PhysicalDevice_T
-> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result)
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
(Ptr PhysicalDevice_T
-> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result)
forall a. FunPtr a
nullFunPtr) (FN_vkVoidFunction -> FN_vkVoidFunction)
-> FN_vkVoidFunction -> FN_vkVoidFunction
forall a b. (a -> b) -> a -> b
$
IOException -> FN_vkVoidFunction
forall e a. (HasCallStack, Exception e) => e -> IO a
throwIO (IOException -> FN_vkVoidFunction)
-> IOException -> FN_vkVoidFunction
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument String
"" String
"The function pointer for vkEnumerateDeviceExtensionProperties is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
let vkEnumerateDeviceExtensionProperties' :: Ptr PhysicalDevice_T
-> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result
vkEnumerateDeviceExtensionProperties' = FunPtr
(Ptr PhysicalDevice_T
-> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result)
-> Ptr PhysicalDevice_T
-> Ptr CChar
-> Ptr Word32
-> Ptr ExtensionProperties
-> IO Result
mkVkEnumerateDeviceExtensionProperties FunPtr
(Ptr PhysicalDevice_T
-> Ptr CChar -> Ptr Word32 -> Ptr ExtensionProperties -> IO Result)
vkEnumerateDeviceExtensionPropertiesPtr
let physicalDevice' :: Ptr PhysicalDevice_T
physicalDevice' = PhysicalDevice -> Ptr PhysicalDevice_T
physicalDeviceHandle (PhysicalDevice
physicalDevice)
pLayerName <- case ("layerName" ::: Maybe ByteString
layerName) of
"layerName" ::: Maybe ByteString
Nothing -> Ptr CChar
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Ptr CChar)
forall a.
a
-> ContT (Result, "properties" ::: Vector ExtensionProperties) IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ptr CChar
forall a. Ptr a
nullPtr
Just ByteString
j -> ((Ptr CChar
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Ptr CChar)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr CChar
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Ptr CChar))
-> ((Ptr CChar
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties)
IO
(Ptr CChar)
forall a b. (a -> b) -> a -> b
$ ByteString
-> (Ptr CChar
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties)
forall a. ByteString -> (Ptr CChar -> IO a) -> IO a
useAsCString (ByteString
j)
pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
r <- lift $ traceAroundEvent "vkEnumerateDeviceExtensionProperties" (vkEnumerateDeviceExtensionProperties'
physicalDevice'
pLayerName
(pPPropertyCount)
(nullPtr))
lift $ when (r < SUCCESS) (throwIO (VulkanException r))
pPropertyCount <- lift $ peek @Word32 pPPropertyCount
pPProperties <- ContT $ bracket (callocBytes @ExtensionProperties ((fromIntegral (pPropertyCount)) * 260)) free
_ <- traverse (\Int
i -> ((() -> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties) IO ()
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((() -> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties) IO ())
-> ((()
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ContT
(Result, "properties" ::: Vector ExtensionProperties) IO ()
forall a b. (a -> b) -> a -> b
$ Ptr ExtensionProperties
-> IO (Result, "properties" ::: Vector ExtensionProperties)
-> IO (Result, "properties" ::: Vector ExtensionProperties)
forall b. Ptr ExtensionProperties -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> IO b -> IO b
pokeZeroCStruct (Ptr ExtensionProperties
pPProperties Ptr ExtensionProperties -> Int -> Ptr ExtensionProperties
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
260) :: Ptr ExtensionProperties) (IO (Result, "properties" ::: Vector ExtensionProperties)
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> ((()
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties))
-> (() -> IO (Result, "properties" ::: Vector ExtensionProperties))
-> IO (Result, "properties" ::: Vector ExtensionProperties)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((() -> IO (Result, "properties" ::: Vector ExtensionProperties))
-> () -> IO (Result, "properties" ::: Vector ExtensionProperties)
forall a b. (a -> b) -> a -> b
$ ())) [0..(fromIntegral (pPropertyCount)) - 1]
r' <- lift $ traceAroundEvent "vkEnumerateDeviceExtensionProperties" (vkEnumerateDeviceExtensionProperties'
physicalDevice'
pLayerName
(pPPropertyCount)
((pPProperties)))
lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\Int
i -> forall a. FromCStruct a => Ptr a -> IO a
peekCStruct @ExtensionProperties (((Ptr ExtensionProperties
pPProperties) Ptr ExtensionProperties -> Int -> Ptr ExtensionProperties
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (Int
260 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr ExtensionProperties)))
pure $ ((r'), pProperties')
data ExtensionProperties = ExtensionProperties
{
ExtensionProperties -> ByteString
extensionName :: ByteString
,
ExtensionProperties -> Word32
specVersion :: Word32
}
deriving (Typeable)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ExtensionProperties)
#endif
deriving instance Show ExtensionProperties
instance ToCStruct ExtensionProperties where
withCStruct :: forall b.
ExtensionProperties -> (Ptr ExtensionProperties -> IO b) -> IO b
withCStruct ExtensionProperties
x Ptr ExtensionProperties -> IO b
f = Int -> (Ptr ExtensionProperties -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
260 ((Ptr ExtensionProperties -> IO b) -> IO b)
-> (Ptr ExtensionProperties -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr ExtensionProperties
p -> Ptr ExtensionProperties -> ExtensionProperties -> IO b -> IO b
forall b.
Ptr ExtensionProperties -> ExtensionProperties -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr ExtensionProperties
p ExtensionProperties
x (Ptr ExtensionProperties -> IO b
f Ptr ExtensionProperties
p)
pokeCStruct :: forall b.
Ptr ExtensionProperties -> ExtensionProperties -> IO b -> IO b
pokeCStruct Ptr ExtensionProperties
p ExtensionProperties{Word32
ByteString
extensionName :: ExtensionProperties -> ByteString
specVersion :: ExtensionProperties -> Word32
extensionName :: ByteString
specVersion :: Word32
..} IO b
f = do
Ptr (FixedArray MAX_EXTENSION_NAME_SIZE CChar)
-> ByteString -> FN_vkVoidFunction
forall (n :: Nat).
KnownNat n =>
Ptr (FixedArray n CChar) -> ByteString -> FN_vkVoidFunction
pokeFixedLengthNullTerminatedByteString ((Ptr ExtensionProperties
p Ptr ExtensionProperties
-> Int -> Ptr (FixedArray MAX_EXTENSION_NAME_SIZE CChar)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr (FixedArray MAX_EXTENSION_NAME_SIZE CChar))) (ByteString
extensionName)
Ptr Word32 -> Word32 -> FN_vkVoidFunction
forall a. Storable a => Ptr a -> a -> FN_vkVoidFunction
poke ((Ptr ExtensionProperties
p Ptr ExtensionProperties -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
256 :: Ptr Word32)) (Word32
specVersion)
IO b
f
cStructSize :: Int
cStructSize = Int
260
cStructAlignment :: Int
cStructAlignment = Int
4
pokeZeroCStruct :: forall b. Ptr ExtensionProperties -> IO b -> IO b
pokeZeroCStruct Ptr ExtensionProperties
p IO b
f = do
Ptr (FixedArray MAX_EXTENSION_NAME_SIZE CChar)
-> ByteString -> FN_vkVoidFunction
forall (n :: Nat).
KnownNat n =>
Ptr (FixedArray n CChar) -> ByteString -> FN_vkVoidFunction
pokeFixedLengthNullTerminatedByteString ((Ptr ExtensionProperties
p Ptr ExtensionProperties
-> Int -> Ptr (FixedArray MAX_EXTENSION_NAME_SIZE CChar)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr (FixedArray MAX_EXTENSION_NAME_SIZE CChar))) (ByteString
forall a. Monoid a => a
mempty)
Ptr Word32 -> Word32 -> FN_vkVoidFunction
forall a. Storable a => Ptr a -> a -> FN_vkVoidFunction
poke ((Ptr ExtensionProperties
p Ptr ExtensionProperties -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
256 :: Ptr Word32)) (Word32
forall a. Zero a => a
zero)
IO b
f
instance FromCStruct ExtensionProperties where
peekCStruct :: Ptr ExtensionProperties -> IO ExtensionProperties
peekCStruct Ptr ExtensionProperties
p = do
extensionName <- Ptr CChar -> IO ByteString
packCString (Ptr (FixedArray MAX_EXTENSION_NAME_SIZE CChar) -> Ptr CChar
forall a (n :: Nat). Ptr (FixedArray n a) -> Ptr a
lowerArrayPtr ((Ptr ExtensionProperties
p Ptr ExtensionProperties
-> Int -> Ptr (FixedArray MAX_EXTENSION_NAME_SIZE CChar)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr (FixedArray MAX_EXTENSION_NAME_SIZE CChar))))
specVersion <- peek @Word32 ((p `plusPtr` 256 :: Ptr Word32))
pure $ ExtensionProperties
extensionName specVersion
instance Storable ExtensionProperties where
sizeOf :: ExtensionProperties -> Int
sizeOf ~ExtensionProperties
_ = Int
260
alignment :: ExtensionProperties -> Int
alignment ~ExtensionProperties
_ = Int
4
peek :: Ptr ExtensionProperties -> IO ExtensionProperties
peek = Ptr ExtensionProperties -> IO ExtensionProperties
forall a. FromCStruct a => Ptr a -> IO a
peekCStruct
poke :: Ptr ExtensionProperties -> ExtensionProperties -> FN_vkVoidFunction
poke Ptr ExtensionProperties
ptr ExtensionProperties
poked = Ptr ExtensionProperties
-> ExtensionProperties -> FN_vkVoidFunction -> FN_vkVoidFunction
forall b.
Ptr ExtensionProperties -> ExtensionProperties -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr ExtensionProperties
ptr ExtensionProperties
poked (() -> FN_vkVoidFunction
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
instance Zero ExtensionProperties where
zero :: ExtensionProperties
zero = ByteString -> Word32 -> ExtensionProperties
ExtensionProperties
ByteString
forall a. Monoid a => a
mempty
Word32
forall a. Zero a => a
zero