{-# language CPP #-}
-- No documentation found for Chapter "ExtensionDiscovery"
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

-- | vkEnumerateInstanceExtensionProperties - Returns up to requested number
-- of global extension properties
--
-- = Description
--
-- When @pLayerName@ parameter is @NULL@, only extensions provided by the
-- Vulkan implementation or by implicitly enabled layers are returned. When
-- @pLayerName@ is the name of a layer, the instance extensions provided by
-- that layer are returned.
--
-- If @pProperties@ is @NULL@, then the number of extensions properties
-- available is returned in @pPropertyCount@. Otherwise, @pPropertyCount@
-- /must/ point to a variable set by the application to the number of
-- elements in the @pProperties@ array, and on return the variable is
-- overwritten with the number of structures actually written to
-- @pProperties@. If @pPropertyCount@ is less than the number of extension
-- properties available, at most @pPropertyCount@ structures will be
-- written, and 'Vulkan.Core10.Enums.Result.INCOMPLETE' will be returned
-- instead of 'Vulkan.Core10.Enums.Result.SUCCESS', to indicate that not
-- all the available properties were returned.
--
-- Because the list of available layers may change externally between calls
-- to 'enumerateInstanceExtensionProperties', two calls may retrieve
-- different results if a @pLayerName@ is available in one call but not in
-- another. The extensions supported by a layer may also change between two
-- calls, e.g. if the layer implementation is replaced by a different
-- version between those calls.
--
-- Implementations /must/ not advertise any pair of extensions that cannot
-- be enabled together due to behavioral differences, or any extension that
-- cannot be enabled against the advertised version.
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkEnumerateInstanceExtensionProperties-pLayerName-parameter#
--     If @pLayerName@ is not @NULL@, @pLayerName@ /must/ be a
--     null-terminated UTF-8 string
--
-- -   #VUID-vkEnumerateInstanceExtensionProperties-pPropertyCount-parameter#
--     @pPropertyCount@ /must/ be a valid pointer to a @uint32_t@ value
--
-- -   #VUID-vkEnumerateInstanceExtensionProperties-pProperties-parameter#
--     If the value referenced by @pPropertyCount@ is not @0@, and
--     @pProperties@ is not @NULL@, @pProperties@ /must/ be a valid pointer
--     to an array of @pPropertyCount@ 'ExtensionProperties' structures
--
-- == Return Codes
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-successcodes Success>]
--
--     -   'Vulkan.Core10.Enums.Result.INCOMPLETE'
--
--     -   'Vulkan.Core10.Enums.Result.SUCCESS'
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-errorcodes Failure>]
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_LAYER_NOT_PRESENT'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_DEVICE_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_HOST_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_UNKNOWN'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_VALIDATION_FAILED'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_0 VK_VERSION_1_0>,
-- 'ExtensionProperties'
enumerateInstanceExtensionProperties :: forall io
                                      . (MonadIO io)
                                     => -- | @pLayerName@ is either @NULL@ or a pointer to a null-terminated UTF-8
                                        -- string naming the layer to retrieve extensions from.
                                        ("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

-- | vkEnumerateDeviceExtensionProperties - Returns properties of available
-- physical device extensions
--
-- = Description
--
-- When @pLayerName@ parameter is @NULL@, only extensions provided by the
-- Vulkan implementation or by implicitly enabled layers are returned. When
-- @pLayerName@ is the name of a layer, the device extensions provided by
-- that layer are returned.
--
-- Implementations /must/ not advertise any pair of extensions that cannot
-- be enabled together due to behavioral differences, or any extension that
-- cannot be enabled against the advertised version.
--
-- If the @VK_KHR_ray_tracing_pipeline@ extension is advertised as
-- supported by this query, the @VK_KHR_pipeline_library@ extension /must/
-- also be supported.
--
-- If the @VK_EXT_descriptor_heap@ extension is advertised as supported by
-- this query, the @VK_KHR_shader_untyped_pointers@ extension /must/ also
-- be supported.
--
-- Implementations claiming support for the
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#roadmap-2022 Roadmap 2022>
-- profile /must/ advertise the @VK_KHR_global_priority@ extension in
-- @pProperties@.
--
-- Implementations claiming support for the
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#roadmap-2024 Roadmap 2024>
-- profile /must/ advertise the following extensions in @pProperties@:
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_dynamic_rendering_local_read VK_KHR_dynamic_rendering_local_read>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_load_store_op_none VK_KHR_load_store_op_none>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_shader_quad_control VK_KHR_shader_quad_control>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_shader_maximal_reconvergence VK_KHR_shader_maximal_reconvergence>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_shader_subgroup_uniform_control_flow VK_KHR_shader_subgroup_uniform_control_flow>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_shader_subgroup_rotate VK_KHR_shader_subgroup_rotate>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_shader_float_controls2 VK_KHR_shader_float_controls2>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_shader_expect_assume VK_KHR_shader_expect_assume>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_line_rasterization VK_KHR_line_rasterization>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_vertex_attribute_divisor VK_KHR_vertex_attribute_divisor>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_index_type_uint8 VK_KHR_index_type_uint8>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_map_memory2 VK_KHR_map_memory2>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_maintenance5 VK_KHR_maintenance5>
--
-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_push_descriptor VK_KHR_push_descriptor>
--
-- Due to platform details on Android, 'enumerateDeviceExtensionProperties'
-- may be called with @physicalDevice@ equal to @NULL@ during layer
-- discovery. This behavior will only be observed by layer implementations,
-- and not the underlying Vulkan driver.
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkEnumerateDeviceExtensionProperties-physicalDevice-parameter#
--     @physicalDevice@ /must/ be a valid
--     'Vulkan.Core10.Handles.PhysicalDevice' handle
--
-- -   #VUID-vkEnumerateDeviceExtensionProperties-pLayerName-parameter# If
--     @pLayerName@ is not @NULL@, @pLayerName@ /must/ be a null-terminated
--     UTF-8 string
--
-- -   #VUID-vkEnumerateDeviceExtensionProperties-pPropertyCount-parameter#
--     @pPropertyCount@ /must/ be a valid pointer to a @uint32_t@ value
--
-- -   #VUID-vkEnumerateDeviceExtensionProperties-pProperties-parameter# If
--     the value referenced by @pPropertyCount@ is not @0@, and
--     @pProperties@ is not @NULL@, @pProperties@ /must/ be a valid pointer
--     to an array of @pPropertyCount@ 'ExtensionProperties' structures
--
-- == Return Codes
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-successcodes Success>]
--
--     -   'Vulkan.Core10.Enums.Result.INCOMPLETE'
--
--     -   'Vulkan.Core10.Enums.Result.SUCCESS'
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-errorcodes Failure>]
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_LAYER_NOT_PRESENT'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_DEVICE_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_HOST_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_UNKNOWN'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_VALIDATION_FAILED'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_0 VK_VERSION_1_0>,
-- 'ExtensionProperties', 'Vulkan.Core10.Handles.PhysicalDevice'
enumerateDeviceExtensionProperties :: forall io
                                    . (MonadIO io)
                                   => -- | @physicalDevice@ is the physical device that will be queried.
                                      PhysicalDevice
                                   -> -- | @pLayerName@ is either @NULL@ or a pointer to a null-terminated UTF-8
                                      -- string naming the layer to retrieve extensions from.
                                      ("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')


-- | VkExtensionProperties - Structure specifying an extension properties
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_0 VK_VERSION_1_0>,
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkVideoCapabilitiesKHR VkVideoCapabilitiesKHR>,
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkVideoSessionCreateInfoKHR VkVideoSessionCreateInfoKHR>,
-- 'enumerateDeviceExtensionProperties',
-- 'enumerateInstanceExtensionProperties'
data ExtensionProperties = ExtensionProperties
  { -- | @extensionName@ is an array of
    -- 'Vulkan.Core10.APIConstants.MAX_EXTENSION_NAME_SIZE' @char@ containing a
    -- null-terminated UTF-8 string which is the name of the extension.
    ExtensionProperties -> ByteString
extensionName :: ByteString
  , -- | @specVersion@ is the version of this extension. It is an integer,
    -- incremented with backward compatible changes.
    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