{-# language CPP #-}
module Vulkan.Extensions.VK_EXT_calibrated_timestamps  ( getPhysicalDeviceCalibrateableTimeDomainsEXT
                                                       , getCalibratedTimestampsEXT
                                                       , CalibratedTimestampInfoEXT(..)
                                                       , TimeDomainEXT( TIME_DOMAIN_DEVICE_EXT
                                                                      , TIME_DOMAIN_CLOCK_MONOTONIC_EXT
                                                                      , TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT
                                                                      , TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT
                                                                      , ..
                                                                      )
                                                       , EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION
                                                       , pattern EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION
                                                       , EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME
                                                       , pattern EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME
                                                       ) where

import Control.Exception.Base (bracket)
import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Foreign.Marshal.Alloc (allocaBytesAligned)
import Foreign.Marshal.Alloc (callocBytes)
import Foreign.Marshal.Alloc (free)
import GHC.Base (when)
import GHC.IO (throwIO)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import GHC.Read (choose)
import GHC.Read (expectP)
import GHC.Read (parens)
import GHC.Show (showParen)
import GHC.Show (showString)
import GHC.Show (showsPrec)
import Text.ParserCombinators.ReadPrec ((+++))
import Text.ParserCombinators.ReadPrec (prec)
import Text.ParserCombinators.ReadPrec (step)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (evalContT)
import Data.Vector (generateM)
import qualified Data.Vector (imapM_)
import qualified Data.Vector (length)
import Control.Monad.IO.Class (MonadIO)
import Data.String (IsString)
import Data.Typeable (Typeable)
import Foreign.Storable (Storable)
import Foreign.Storable (Storable(peek))
import Foreign.Storable (Storable(poke))
import qualified Foreign.Storable (Storable(..))
import GHC.IO.Exception (IOErrorType(..))
import GHC.IO.Exception (IOException(..))
import Data.Int (Int32)
import Foreign.Ptr (FunPtr)
import Foreign.Ptr (Ptr)
import GHC.Read (Read(readPrec))
import Data.Word (Word32)
import Data.Word (Word64)
import Text.Read.Lex (Lexeme(Ident))
import Data.Kind (Type)
import Control.Monad.Trans.Cont (ContT(..))
import Data.Vector (Vector)
import Vulkan.CStruct.Utils (advancePtrBytes)
import Vulkan.NamedType ((:::))
import Vulkan.Core10.Handles (Device)
import Vulkan.Core10.Handles (Device(..))
import Vulkan.Dynamic (DeviceCmds(pVkGetCalibratedTimestampsEXT))
import Vulkan.Core10.Handles (Device_T)
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.Dynamic (InstanceCmds(pVkGetPhysicalDeviceCalibrateableTimeDomainsEXT))
import Vulkan.Core10.Handles (PhysicalDevice)
import Vulkan.Core10.Handles (PhysicalDevice(..))
import Vulkan.Core10.Handles (PhysicalDevice_T)
import Vulkan.Core10.Enums.Result (Result)
import Vulkan.Core10.Enums.Result (Result(..))
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Exception (VulkanException(..))
import Vulkan.Zero (Zero)
import Vulkan.Zero (Zero(..))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT))
import Vulkan.Core10.Enums.Result (Result(SUCCESS))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkGetPhysicalDeviceCalibrateableTimeDomainsEXT
  :: FunPtr (Ptr PhysicalDevice_T -> Ptr Word32 -> Ptr TimeDomainEXT -> IO Result) -> Ptr PhysicalDevice_T -> Ptr Word32 -> Ptr TimeDomainEXT -> IO Result

-- | vkGetPhysicalDeviceCalibrateableTimeDomainsEXT - Query calibrateable
-- time domains
--
-- = Parameters
--
-- -   @physicalDevice@ is the physical device from which to query the set
--     of calibrateable time domains.
--
-- -   @pTimeDomainCount@ is a pointer to an integer related to the number
--     of calibrateable time domains available or queried, as described
--     below.
--
-- -   @pTimeDomains@ is either @NULL@ or a pointer to an array of
--     'TimeDomainEXT' values, indicating the supported calibrateable time
--     domains.
--
-- = Description
--
-- If @pTimeDomains@ is @NULL@, then the number of calibrateable time
-- domains supported for the given @physicalDevice@ is returned in
-- @pTimeDomainCount@. Otherwise, @pTimeDomainCount@ /must/ point to a
-- variable set by the user to the number of elements in the @pTimeDomains@
-- array, and on return the variable is overwritten with the number of
-- values actually written to @pTimeDomains@. If the value of
-- @pTimeDomainCount@ is less than the number of calibrateable time domains
-- supported, at most @pTimeDomainCount@ values will be written to
-- @pTimeDomains@. If @pTimeDomainCount@ is smaller than the number of
-- calibrateable time domains supported for the given @physicalDevice@,
-- 'Vulkan.Core10.Enums.Result.INCOMPLETE' will be returned instead of
-- 'Vulkan.Core10.Enums.Result.SUCCESS' to indicate that not all the
-- available values were returned.
--
-- == Valid Usage (Implicit)
--
-- -   @physicalDevice@ /must/ be a valid
--     'Vulkan.Core10.Handles.PhysicalDevice' handle
--
-- -   @pTimeDomainCount@ /must/ be a valid pointer to a @uint32_t@ value
--
-- -   If the value referenced by @pTimeDomainCount@ is not @0@, and
--     @pTimeDomains@ is not @NULL@, @pTimeDomains@ /must/ be a valid
--     pointer to an array of @pTimeDomainCount@ 'TimeDomainEXT' values
--
-- == Return Codes
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-successcodes Success>]
--
--     -   'Vulkan.Core10.Enums.Result.SUCCESS'
--
--     -   'Vulkan.Core10.Enums.Result.INCOMPLETE'
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-errorcodes Failure>]
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_HOST_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_DEVICE_MEMORY'
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.PhysicalDevice', 'TimeDomainEXT'
getPhysicalDeviceCalibrateableTimeDomainsEXT :: forall io . MonadIO io => PhysicalDevice -> io (Result, ("timeDomains" ::: Vector TimeDomainEXT))
getPhysicalDeviceCalibrateableTimeDomainsEXT :: PhysicalDevice
-> io (Result, "timeDomains" ::: Vector TimeDomainEXT)
getPhysicalDeviceCalibrateableTimeDomainsEXT physicalDevice :: PhysicalDevice
physicalDevice = IO (Result, "timeDomains" ::: Vector TimeDomainEXT)
-> io (Result, "timeDomains" ::: Vector TimeDomainEXT)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Result, "timeDomains" ::: Vector TimeDomainEXT)
 -> io (Result, "timeDomains" ::: Vector TimeDomainEXT))
-> (ContT
      (Result, "timeDomains" ::: Vector TimeDomainEXT)
      IO
      (Result, "timeDomains" ::: Vector TimeDomainEXT)
    -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
-> ContT
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
     IO
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
-> io (Result, "timeDomains" ::: Vector TimeDomainEXT)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT
  (Result, "timeDomains" ::: Vector TimeDomainEXT)
  IO
  (Result, "timeDomains" ::: Vector TimeDomainEXT)
-> IO (Result, "timeDomains" ::: Vector TimeDomainEXT)
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT
   (Result, "timeDomains" ::: Vector TimeDomainEXT)
   IO
   (Result, "timeDomains" ::: Vector TimeDomainEXT)
 -> io (Result, "timeDomains" ::: Vector TimeDomainEXT))
-> ContT
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
     IO
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
-> io (Result, "timeDomains" ::: Vector TimeDomainEXT)
forall a b. (a -> b) -> a -> b
$ do
  let vkGetPhysicalDeviceCalibrateableTimeDomainsEXTPtr :: FunPtr
  (Ptr PhysicalDevice_T
   -> ("pTimeDomainCount" ::: Ptr Word32)
   -> ("pTimeDomains" ::: Ptr TimeDomainEXT)
   -> IO Result)
vkGetPhysicalDeviceCalibrateableTimeDomainsEXTPtr = InstanceCmds
-> FunPtr
     (Ptr PhysicalDevice_T
      -> ("pTimeDomainCount" ::: Ptr Word32)
      -> ("pTimeDomains" ::: Ptr TimeDomainEXT)
      -> IO Result)
pVkGetPhysicalDeviceCalibrateableTimeDomainsEXT (PhysicalDevice -> InstanceCmds
instanceCmds (PhysicalDevice
physicalDevice :: PhysicalDevice))
  IO ()
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO ()
 -> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO ())
-> IO ()
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr PhysicalDevice_T
   -> ("pTimeDomainCount" ::: Ptr Word32)
   -> ("pTimeDomains" ::: Ptr TimeDomainEXT)
   -> IO Result)
vkGetPhysicalDeviceCalibrateableTimeDomainsEXTPtr FunPtr
  (Ptr PhysicalDevice_T
   -> ("pTimeDomainCount" ::: Ptr Word32)
   -> ("pTimeDomains" ::: Ptr TimeDomainEXT)
   -> IO Result)
-> FunPtr
     (Ptr PhysicalDevice_T
      -> ("pTimeDomainCount" ::: Ptr Word32)
      -> ("pTimeDomains" ::: Ptr TimeDomainEXT)
      -> IO Result)
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr PhysicalDevice_T
   -> ("pTimeDomainCount" ::: Ptr Word32)
   -> ("pTimeDomains" ::: Ptr TimeDomainEXT)
   -> IO Result)
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
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 "" "The function pointer for vkGetPhysicalDeviceCalibrateableTimeDomainsEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkGetPhysicalDeviceCalibrateableTimeDomainsEXT' :: Ptr PhysicalDevice_T
-> ("pTimeDomainCount" ::: Ptr Word32)
-> ("pTimeDomains" ::: Ptr TimeDomainEXT)
-> IO Result
vkGetPhysicalDeviceCalibrateableTimeDomainsEXT' = FunPtr
  (Ptr PhysicalDevice_T
   -> ("pTimeDomainCount" ::: Ptr Word32)
   -> ("pTimeDomains" ::: Ptr TimeDomainEXT)
   -> IO Result)
-> Ptr PhysicalDevice_T
-> ("pTimeDomainCount" ::: Ptr Word32)
-> ("pTimeDomains" ::: Ptr TimeDomainEXT)
-> IO Result
mkVkGetPhysicalDeviceCalibrateableTimeDomainsEXT FunPtr
  (Ptr PhysicalDevice_T
   -> ("pTimeDomainCount" ::: Ptr Word32)
   -> ("pTimeDomains" ::: Ptr TimeDomainEXT)
   -> IO Result)
vkGetPhysicalDeviceCalibrateableTimeDomainsEXTPtr
  let physicalDevice' :: Ptr PhysicalDevice_T
physicalDevice' = PhysicalDevice -> Ptr PhysicalDevice_T
physicalDeviceHandle (PhysicalDevice
physicalDevice)
  "pTimeDomainCount" ::: Ptr Word32
pPTimeDomainCount <- ((("pTimeDomainCount" ::: Ptr Word32)
  -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
 -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
-> ContT
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
     IO
     ("pTimeDomainCount" ::: Ptr Word32)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pTimeDomainCount" ::: Ptr Word32)
   -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
  -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
 -> ContT
      (Result, "timeDomains" ::: Vector TimeDomainEXT)
      IO
      ("pTimeDomainCount" ::: Ptr Word32))
-> ((("pTimeDomainCount" ::: Ptr Word32)
     -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
    -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
-> ContT
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
     IO
     ("pTimeDomainCount" ::: Ptr Word32)
forall a b. (a -> b) -> a -> b
$ IO ("pTimeDomainCount" ::: Ptr Word32)
-> (("pTimeDomainCount" ::: Ptr Word32) -> IO ())
-> (("pTimeDomainCount" ::: Ptr Word32)
    -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
-> IO (Result, "timeDomains" ::: Vector TimeDomainEXT)
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (Int -> IO ("pTimeDomainCount" ::: Ptr Word32)
forall a. Int -> IO (Ptr a)
callocBytes @Word32 4) ("pTimeDomainCount" ::: Ptr Word32) -> IO ()
forall a. Ptr a -> IO ()
free
  Result
r <- IO Result
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO Result
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO Result
 -> ContT
      (Result, "timeDomains" ::: Vector TimeDomainEXT) IO Result)
-> IO Result
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO Result
forall a b. (a -> b) -> a -> b
$ Ptr PhysicalDevice_T
-> ("pTimeDomainCount" ::: Ptr Word32)
-> ("pTimeDomains" ::: Ptr TimeDomainEXT)
-> IO Result
vkGetPhysicalDeviceCalibrateableTimeDomainsEXT' Ptr PhysicalDevice_T
physicalDevice' ("pTimeDomainCount" ::: Ptr Word32
pPTimeDomainCount) ("pTimeDomains" ::: Ptr TimeDomainEXT
forall a. Ptr a
nullPtr)
  IO ()
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO ()
 -> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO ())
-> IO ()
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Result
r Result -> Result -> Bool
forall a. Ord a => a -> a -> Bool
< Result
SUCCESS) (VulkanException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (Result -> VulkanException
VulkanException Result
r))
  Word32
pTimeDomainCount <- IO Word32
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO Word32
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO Word32
 -> ContT
      (Result, "timeDomains" ::: Vector TimeDomainEXT) IO Word32)
-> IO Word32
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO Word32
forall a b. (a -> b) -> a -> b
$ ("pTimeDomainCount" ::: Ptr Word32) -> IO Word32
forall a. Storable a => Ptr a -> IO a
peek @Word32 "pTimeDomainCount" ::: Ptr Word32
pPTimeDomainCount
  "pTimeDomains" ::: Ptr TimeDomainEXT
pPTimeDomains <- ((("pTimeDomains" ::: Ptr TimeDomainEXT)
  -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
 -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
-> ContT
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
     IO
     ("pTimeDomains" ::: Ptr TimeDomainEXT)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pTimeDomains" ::: Ptr TimeDomainEXT)
   -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
  -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
 -> ContT
      (Result, "timeDomains" ::: Vector TimeDomainEXT)
      IO
      ("pTimeDomains" ::: Ptr TimeDomainEXT))
-> ((("pTimeDomains" ::: Ptr TimeDomainEXT)
     -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
    -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
-> ContT
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
     IO
     ("pTimeDomains" ::: Ptr TimeDomainEXT)
forall a b. (a -> b) -> a -> b
$ IO ("pTimeDomains" ::: Ptr TimeDomainEXT)
-> (("pTimeDomains" ::: Ptr TimeDomainEXT) -> IO ())
-> (("pTimeDomains" ::: Ptr TimeDomainEXT)
    -> IO (Result, "timeDomains" ::: Vector TimeDomainEXT))
-> IO (Result, "timeDomains" ::: Vector TimeDomainEXT)
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (Int -> IO ("pTimeDomains" ::: Ptr TimeDomainEXT)
forall a. Int -> IO (Ptr a)
callocBytes @TimeDomainEXT ((Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word32
pTimeDomainCount)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* 4)) ("pTimeDomains" ::: Ptr TimeDomainEXT) -> IO ()
forall a. Ptr a -> IO ()
free
  Result
r' <- IO Result
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO Result
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO Result
 -> ContT
      (Result, "timeDomains" ::: Vector TimeDomainEXT) IO Result)
-> IO Result
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO Result
forall a b. (a -> b) -> a -> b
$ Ptr PhysicalDevice_T
-> ("pTimeDomainCount" ::: Ptr Word32)
-> ("pTimeDomains" ::: Ptr TimeDomainEXT)
-> IO Result
vkGetPhysicalDeviceCalibrateableTimeDomainsEXT' Ptr PhysicalDevice_T
physicalDevice' ("pTimeDomainCount" ::: Ptr Word32
pPTimeDomainCount) ("pTimeDomains" ::: Ptr TimeDomainEXT
pPTimeDomains)
  IO ()
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO ()
 -> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO ())
-> IO ()
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Result
r' Result -> Result -> Bool
forall a. Ord a => a -> a -> Bool
< Result
SUCCESS) (VulkanException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (Result -> VulkanException
VulkanException Result
r'))
  Word32
pTimeDomainCount' <- IO Word32
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO Word32
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO Word32
 -> ContT
      (Result, "timeDomains" ::: Vector TimeDomainEXT) IO Word32)
-> IO Word32
-> ContT (Result, "timeDomains" ::: Vector TimeDomainEXT) IO Word32
forall a b. (a -> b) -> a -> b
$ ("pTimeDomainCount" ::: Ptr Word32) -> IO Word32
forall a. Storable a => Ptr a -> IO a
peek @Word32 "pTimeDomainCount" ::: Ptr Word32
pPTimeDomainCount
  "timeDomains" ::: Vector TimeDomainEXT
pTimeDomains' <- IO ("timeDomains" ::: Vector TimeDomainEXT)
-> ContT
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
     IO
     ("timeDomains" ::: Vector TimeDomainEXT)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO ("timeDomains" ::: Vector TimeDomainEXT)
 -> ContT
      (Result, "timeDomains" ::: Vector TimeDomainEXT)
      IO
      ("timeDomains" ::: Vector TimeDomainEXT))
-> IO ("timeDomains" ::: Vector TimeDomainEXT)
-> ContT
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
     IO
     ("timeDomains" ::: Vector TimeDomainEXT)
forall a b. (a -> b) -> a -> b
$ Int
-> (Int -> IO TimeDomainEXT)
-> IO ("timeDomains" ::: Vector TimeDomainEXT)
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> m a) -> m (Vector a)
generateM (Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word32
pTimeDomainCount')) (\i :: Int
i -> ("pTimeDomains" ::: Ptr TimeDomainEXT) -> IO TimeDomainEXT
forall a. Storable a => Ptr a -> IO a
peek @TimeDomainEXT (("pTimeDomains" ::: Ptr TimeDomainEXT
pPTimeDomains ("pTimeDomains" ::: Ptr TimeDomainEXT)
-> Int -> "pTimeDomains" ::: Ptr TimeDomainEXT
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (4 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr TimeDomainEXT)))
  (Result, "timeDomains" ::: Vector TimeDomainEXT)
-> ContT
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
     IO
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Result, "timeDomains" ::: Vector TimeDomainEXT)
 -> ContT
      (Result, "timeDomains" ::: Vector TimeDomainEXT)
      IO
      (Result, "timeDomains" ::: Vector TimeDomainEXT))
-> (Result, "timeDomains" ::: Vector TimeDomainEXT)
-> ContT
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
     IO
     (Result, "timeDomains" ::: Vector TimeDomainEXT)
forall a b. (a -> b) -> a -> b
$ ((Result
r'), "timeDomains" ::: Vector TimeDomainEXT
pTimeDomains')


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkGetCalibratedTimestampsEXT
  :: FunPtr (Ptr Device_T -> Word32 -> Ptr CalibratedTimestampInfoEXT -> Ptr Word64 -> Ptr Word64 -> IO Result) -> Ptr Device_T -> Word32 -> Ptr CalibratedTimestampInfoEXT -> Ptr Word64 -> Ptr Word64 -> IO Result

-- | vkGetCalibratedTimestampsEXT - Query calibrated timestamps
--
-- = Parameters
--
-- -   @device@ is the logical device used to perform the query.
--
-- -   @timestampCount@ is the number of timestamps to query.
--
-- -   @pTimestampInfos@ is a pointer to an array of @timestampCount@
--     'CalibratedTimestampInfoEXT' structures, describing the time domains
--     the calibrated timestamps should be captured from.
--
-- -   @pTimestamps@ is a pointer to an array of @timestampCount@ 64-bit
--     unsigned integer values in which the requested calibrated timestamp
--     values are returned.
--
-- -   @pMaxDeviation@ is a pointer to a 64-bit unsigned integer value in
--     which the strictly positive maximum deviation, in nanoseconds, of
--     the calibrated timestamp values is returned.
--
-- = Description
--
-- Note
--
-- The maximum deviation /may/ vary between calls to
-- 'getCalibratedTimestampsEXT' even for the same set of time domains due
-- to implementation and platform specific reasons. It is the application’s
-- responsibility to assess whether the returned maximum deviation makes
-- the timestamp values suitable for any particular purpose and /can/
-- choose to re-issue the timestamp calibration call pursuing a lower
-- devation value.
--
-- Calibrated timestamp values /can/ be extrapolated to estimate future
-- coinciding timestamp values, however, depending on the nature of the
-- time domains and other properties of the platform extrapolating values
-- over a sufficiently long period of time /may/ no longer be accurate
-- enough to fit any particular purpose so applications are expected to
-- re-calibrate the timestamps on a regular basis.
--
-- == Return Codes
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-successcodes Success>]
--
--     -   '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_OUT_OF_HOST_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_DEVICE_MEMORY'
--
-- = See Also
--
-- 'CalibratedTimestampInfoEXT', 'Vulkan.Core10.Handles.Device'
getCalibratedTimestampsEXT :: forall io . MonadIO io => Device -> ("timestampInfos" ::: Vector CalibratedTimestampInfoEXT) -> io (("timestamps" ::: Vector Word64), ("maxDeviation" ::: Word64))
getCalibratedTimestampsEXT :: Device
-> ("timestampInfos" ::: Vector CalibratedTimestampInfoEXT)
-> io ("timestamps" ::: Vector Word64, Word64)
getCalibratedTimestampsEXT device :: Device
device timestampInfos :: "timestampInfos" ::: Vector CalibratedTimestampInfoEXT
timestampInfos = IO ("timestamps" ::: Vector Word64, Word64)
-> io ("timestamps" ::: Vector Word64, Word64)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO ("timestamps" ::: Vector Word64, Word64)
 -> io ("timestamps" ::: Vector Word64, Word64))
-> (ContT
      ("timestamps" ::: Vector Word64, Word64)
      IO
      ("timestamps" ::: Vector Word64, Word64)
    -> IO ("timestamps" ::: Vector Word64, Word64))
-> ContT
     ("timestamps" ::: Vector Word64, Word64)
     IO
     ("timestamps" ::: Vector Word64, Word64)
-> io ("timestamps" ::: Vector Word64, Word64)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT
  ("timestamps" ::: Vector Word64, Word64)
  IO
  ("timestamps" ::: Vector Word64, Word64)
-> IO ("timestamps" ::: Vector Word64, Word64)
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT
   ("timestamps" ::: Vector Word64, Word64)
   IO
   ("timestamps" ::: Vector Word64, Word64)
 -> io ("timestamps" ::: Vector Word64, Word64))
-> ContT
     ("timestamps" ::: Vector Word64, Word64)
     IO
     ("timestamps" ::: Vector Word64, Word64)
-> io ("timestamps" ::: Vector Word64, Word64)
forall a b. (a -> b) -> a -> b
$ do
  let vkGetCalibratedTimestampsEXTPtr :: FunPtr
  (Ptr Device_T
   -> Word32
   -> ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
   -> ("pTimestamps" ::: Ptr Word64)
   -> ("pTimestamps" ::: Ptr Word64)
   -> IO Result)
vkGetCalibratedTimestampsEXTPtr = DeviceCmds
-> FunPtr
     (Ptr Device_T
      -> Word32
      -> ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
      -> ("pTimestamps" ::: Ptr Word64)
      -> ("pTimestamps" ::: Ptr Word64)
      -> IO Result)
pVkGetCalibratedTimestampsEXT (Device -> DeviceCmds
deviceCmds (Device
device :: Device))
  IO () -> ContT ("timestamps" ::: Vector Word64, Word64) IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT ("timestamps" ::: Vector Word64, Word64) IO ())
-> IO () -> ContT ("timestamps" ::: Vector Word64, Word64) IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T
   -> Word32
   -> ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
   -> ("pTimestamps" ::: Ptr Word64)
   -> ("pTimestamps" ::: Ptr Word64)
   -> IO Result)
vkGetCalibratedTimestampsEXTPtr FunPtr
  (Ptr Device_T
   -> Word32
   -> ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
   -> ("pTimestamps" ::: Ptr Word64)
   -> ("pTimestamps" ::: Ptr Word64)
   -> IO Result)
-> FunPtr
     (Ptr Device_T
      -> Word32
      -> ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
      -> ("pTimestamps" ::: Ptr Word64)
      -> ("pTimestamps" ::: Ptr Word64)
      -> IO Result)
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr Device_T
   -> Word32
   -> ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
   -> ("pTimestamps" ::: Ptr Word64)
   -> ("pTimestamps" ::: Ptr Word64)
   -> IO Result)
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
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 "" "The function pointer for vkGetCalibratedTimestampsEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkGetCalibratedTimestampsEXT' :: Ptr Device_T
-> Word32
-> ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> ("pTimestamps" ::: Ptr Word64)
-> ("pTimestamps" ::: Ptr Word64)
-> IO Result
vkGetCalibratedTimestampsEXT' = FunPtr
  (Ptr Device_T
   -> Word32
   -> ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
   -> ("pTimestamps" ::: Ptr Word64)
   -> ("pTimestamps" ::: Ptr Word64)
   -> IO Result)
-> Ptr Device_T
-> Word32
-> ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> ("pTimestamps" ::: Ptr Word64)
-> ("pTimestamps" ::: Ptr Word64)
-> IO Result
mkVkGetCalibratedTimestampsEXT FunPtr
  (Ptr Device_T
   -> Word32
   -> ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
   -> ("pTimestamps" ::: Ptr Word64)
   -> ("pTimestamps" ::: Ptr Word64)
   -> IO Result)
vkGetCalibratedTimestampsEXTPtr
  "pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
pPTimestampInfos <- ((("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
  -> IO ("timestamps" ::: Vector Word64, Word64))
 -> IO ("timestamps" ::: Vector Word64, Word64))
-> ContT
     ("timestamps" ::: Vector Word64, Word64)
     IO
     ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
   -> IO ("timestamps" ::: Vector Word64, Word64))
  -> IO ("timestamps" ::: Vector Word64, Word64))
 -> ContT
      ("timestamps" ::: Vector Word64, Word64)
      IO
      ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT))
-> ((("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
     -> IO ("timestamps" ::: Vector Word64, Word64))
    -> IO ("timestamps" ::: Vector Word64, Word64))
-> ContT
     ("timestamps" ::: Vector Word64, Word64)
     IO
     ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
forall a b. (a -> b) -> a -> b
$ Int
-> Int
-> (("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
    -> IO ("timestamps" ::: Vector Word64, Word64))
-> IO ("timestamps" ::: Vector Word64, Word64)
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned @CalibratedTimestampInfoEXT ((("timestampInfos" ::: Vector CalibratedTimestampInfoEXT) -> Int
forall a. Vector a -> Int
Data.Vector.length ("timestampInfos" ::: Vector CalibratedTimestampInfoEXT
timestampInfos)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* 24) 8
  (Int
 -> CalibratedTimestampInfoEXT
 -> ContT ("timestamps" ::: Vector Word64, Word64) IO ())
-> ("timestampInfos" ::: Vector CalibratedTimestampInfoEXT)
-> ContT ("timestamps" ::: Vector Word64, Word64) IO ()
forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\i :: Int
i e :: CalibratedTimestampInfoEXT
e -> ((() -> IO ("timestamps" ::: Vector Word64, Word64))
 -> IO ("timestamps" ::: Vector Word64, Word64))
-> ContT ("timestamps" ::: Vector Word64, Word64) IO ()
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((() -> IO ("timestamps" ::: Vector Word64, Word64))
  -> IO ("timestamps" ::: Vector Word64, Word64))
 -> ContT ("timestamps" ::: Vector Word64, Word64) IO ())
-> ((() -> IO ("timestamps" ::: Vector Word64, Word64))
    -> IO ("timestamps" ::: Vector Word64, Word64))
-> ContT ("timestamps" ::: Vector Word64, Word64) IO ()
forall a b. (a -> b) -> a -> b
$ ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> CalibratedTimestampInfoEXT
-> IO ("timestamps" ::: Vector Word64, Word64)
-> IO ("timestamps" ::: Vector Word64, Word64)
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
pPTimestampInfos ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> Int -> "pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (24 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr CalibratedTimestampInfoEXT) (CalibratedTimestampInfoEXT
e) (IO ("timestamps" ::: Vector Word64, Word64)
 -> IO ("timestamps" ::: Vector Word64, Word64))
-> ((() -> IO ("timestamps" ::: Vector Word64, Word64))
    -> IO ("timestamps" ::: Vector Word64, Word64))
-> (() -> IO ("timestamps" ::: Vector Word64, Word64))
-> IO ("timestamps" ::: Vector Word64, Word64)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((() -> IO ("timestamps" ::: Vector Word64, Word64))
-> () -> IO ("timestamps" ::: Vector Word64, Word64)
forall a b. (a -> b) -> a -> b
$ ())) ("timestampInfos" ::: Vector CalibratedTimestampInfoEXT
timestampInfos)
  "pTimestamps" ::: Ptr Word64
pPTimestamps <- ((("pTimestamps" ::: Ptr Word64)
  -> IO ("timestamps" ::: Vector Word64, Word64))
 -> IO ("timestamps" ::: Vector Word64, Word64))
-> ContT
     ("timestamps" ::: Vector Word64, Word64)
     IO
     ("pTimestamps" ::: Ptr Word64)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pTimestamps" ::: Ptr Word64)
   -> IO ("timestamps" ::: Vector Word64, Word64))
  -> IO ("timestamps" ::: Vector Word64, Word64))
 -> ContT
      ("timestamps" ::: Vector Word64, Word64)
      IO
      ("pTimestamps" ::: Ptr Word64))
-> ((("pTimestamps" ::: Ptr Word64)
     -> IO ("timestamps" ::: Vector Word64, Word64))
    -> IO ("timestamps" ::: Vector Word64, Word64))
-> ContT
     ("timestamps" ::: Vector Word64, Word64)
     IO
     ("pTimestamps" ::: Ptr Word64)
forall a b. (a -> b) -> a -> b
$ IO ("pTimestamps" ::: Ptr Word64)
-> (("pTimestamps" ::: Ptr Word64) -> IO ())
-> (("pTimestamps" ::: Ptr Word64)
    -> IO ("timestamps" ::: Vector Word64, Word64))
-> IO ("timestamps" ::: Vector Word64, Word64)
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (Int -> IO ("pTimestamps" ::: Ptr Word64)
forall a. Int -> IO (Ptr a)
callocBytes @Word64 ((Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral ((Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (("timestampInfos" ::: Vector CalibratedTimestampInfoEXT) -> Int
forall a. Vector a -> Int
Data.Vector.length (("timestampInfos" ::: Vector CalibratedTimestampInfoEXT) -> Int)
-> ("timestampInfos" ::: Vector CalibratedTimestampInfoEXT) -> Int
forall a b. (a -> b) -> a -> b
$ ("timestampInfos" ::: Vector CalibratedTimestampInfoEXT
timestampInfos)) :: Word32))) Int -> Int -> Int
forall a. Num a => a -> a -> a
* 8)) ("pTimestamps" ::: Ptr Word64) -> IO ()
forall a. Ptr a -> IO ()
free
  "pTimestamps" ::: Ptr Word64
pPMaxDeviation <- ((("pTimestamps" ::: Ptr Word64)
  -> IO ("timestamps" ::: Vector Word64, Word64))
 -> IO ("timestamps" ::: Vector Word64, Word64))
-> ContT
     ("timestamps" ::: Vector Word64, Word64)
     IO
     ("pTimestamps" ::: Ptr Word64)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pTimestamps" ::: Ptr Word64)
   -> IO ("timestamps" ::: Vector Word64, Word64))
  -> IO ("timestamps" ::: Vector Word64, Word64))
 -> ContT
      ("timestamps" ::: Vector Word64, Word64)
      IO
      ("pTimestamps" ::: Ptr Word64))
-> ((("pTimestamps" ::: Ptr Word64)
     -> IO ("timestamps" ::: Vector Word64, Word64))
    -> IO ("timestamps" ::: Vector Word64, Word64))
-> ContT
     ("timestamps" ::: Vector Word64, Word64)
     IO
     ("pTimestamps" ::: Ptr Word64)
forall a b. (a -> b) -> a -> b
$ IO ("pTimestamps" ::: Ptr Word64)
-> (("pTimestamps" ::: Ptr Word64) -> IO ())
-> (("pTimestamps" ::: Ptr Word64)
    -> IO ("timestamps" ::: Vector Word64, Word64))
-> IO ("timestamps" ::: Vector Word64, Word64)
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (Int -> IO ("pTimestamps" ::: Ptr Word64)
forall a. Int -> IO (Ptr a)
callocBytes @Word64 8) ("pTimestamps" ::: Ptr Word64) -> IO ()
forall a. Ptr a -> IO ()
free
  Result
r <- IO Result
-> ContT ("timestamps" ::: Vector Word64, Word64) IO Result
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO Result
 -> ContT ("timestamps" ::: Vector Word64, Word64) IO Result)
-> IO Result
-> ContT ("timestamps" ::: Vector Word64, Word64) IO Result
forall a b. (a -> b) -> a -> b
$ Ptr Device_T
-> Word32
-> ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> ("pTimestamps" ::: Ptr Word64)
-> ("pTimestamps" ::: Ptr Word64)
-> IO Result
vkGetCalibratedTimestampsEXT' (Device -> Ptr Device_T
deviceHandle (Device
device)) ((Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (("timestampInfos" ::: Vector CalibratedTimestampInfoEXT) -> Int
forall a. Vector a -> Int
Data.Vector.length (("timestampInfos" ::: Vector CalibratedTimestampInfoEXT) -> Int)
-> ("timestampInfos" ::: Vector CalibratedTimestampInfoEXT) -> Int
forall a b. (a -> b) -> a -> b
$ ("timestampInfos" ::: Vector CalibratedTimestampInfoEXT
timestampInfos)) :: Word32)) ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
pPTimestampInfos) ("pTimestamps" ::: Ptr Word64
pPTimestamps) ("pTimestamps" ::: Ptr Word64
pPMaxDeviation)
  IO () -> ContT ("timestamps" ::: Vector Word64, Word64) IO ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT ("timestamps" ::: Vector Word64, Word64) IO ())
-> IO () -> ContT ("timestamps" ::: Vector Word64, Word64) IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Result
r Result -> Result -> Bool
forall a. Ord a => a -> a -> Bool
< Result
SUCCESS) (VulkanException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (Result -> VulkanException
VulkanException Result
r))
  "timestamps" ::: Vector Word64
pTimestamps <- IO ("timestamps" ::: Vector Word64)
-> ContT
     ("timestamps" ::: Vector Word64, Word64)
     IO
     ("timestamps" ::: Vector Word64)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO ("timestamps" ::: Vector Word64)
 -> ContT
      ("timestamps" ::: Vector Word64, Word64)
      IO
      ("timestamps" ::: Vector Word64))
-> IO ("timestamps" ::: Vector Word64)
-> ContT
     ("timestamps" ::: Vector Word64, Word64)
     IO
     ("timestamps" ::: Vector Word64)
forall a b. (a -> b) -> a -> b
$ Int -> (Int -> IO Word64) -> IO ("timestamps" ::: Vector Word64)
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> m a) -> m (Vector a)
generateM (Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral ((Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (("timestampInfos" ::: Vector CalibratedTimestampInfoEXT) -> Int
forall a. Vector a -> Int
Data.Vector.length (("timestampInfos" ::: Vector CalibratedTimestampInfoEXT) -> Int)
-> ("timestampInfos" ::: Vector CalibratedTimestampInfoEXT) -> Int
forall a b. (a -> b) -> a -> b
$ ("timestampInfos" ::: Vector CalibratedTimestampInfoEXT
timestampInfos)) :: Word32))) (\i :: Int
i -> ("pTimestamps" ::: Ptr Word64) -> IO Word64
forall a. Storable a => Ptr a -> IO a
peek @Word64 (("pTimestamps" ::: Ptr Word64
pPTimestamps ("pTimestamps" ::: Ptr Word64)
-> Int -> "pTimestamps" ::: Ptr Word64
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr Word64)))
  Word64
pMaxDeviation <- IO Word64
-> ContT ("timestamps" ::: Vector Word64, Word64) IO Word64
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO Word64
 -> ContT ("timestamps" ::: Vector Word64, Word64) IO Word64)
-> IO Word64
-> ContT ("timestamps" ::: Vector Word64, Word64) IO Word64
forall a b. (a -> b) -> a -> b
$ ("pTimestamps" ::: Ptr Word64) -> IO Word64
forall a. Storable a => Ptr a -> IO a
peek @Word64 "pTimestamps" ::: Ptr Word64
pPMaxDeviation
  ("timestamps" ::: Vector Word64, Word64)
-> ContT
     ("timestamps" ::: Vector Word64, Word64)
     IO
     ("timestamps" ::: Vector Word64, Word64)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (("timestamps" ::: Vector Word64, Word64)
 -> ContT
      ("timestamps" ::: Vector Word64, Word64)
      IO
      ("timestamps" ::: Vector Word64, Word64))
-> ("timestamps" ::: Vector Word64, Word64)
-> ContT
     ("timestamps" ::: Vector Word64, Word64)
     IO
     ("timestamps" ::: Vector Word64, Word64)
forall a b. (a -> b) -> a -> b
$ ("timestamps" ::: Vector Word64
pTimestamps, Word64
pMaxDeviation)


-- | VkCalibratedTimestampInfoEXT - Structure specifying the input parameters
-- of a calibrated timestamp query
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- 'Vulkan.Core10.Enums.StructureType.StructureType', 'TimeDomainEXT',
-- 'getCalibratedTimestampsEXT'
data CalibratedTimestampInfoEXT = CalibratedTimestampInfoEXT
  { -- | @timeDomain@ /must/ be a valid 'TimeDomainEXT' value
    CalibratedTimestampInfoEXT -> TimeDomainEXT
timeDomain :: TimeDomainEXT }
  deriving (Typeable)
deriving instance Show CalibratedTimestampInfoEXT

instance ToCStruct CalibratedTimestampInfoEXT where
  withCStruct :: CalibratedTimestampInfoEXT
-> (("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT) -> IO b)
-> IO b
withCStruct x :: CalibratedTimestampInfoEXT
x f :: ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT) -> IO b
f = Int
-> Int
-> (("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT) -> IO b)
-> IO b
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned 24 8 ((("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT) -> IO b)
 -> IO b)
-> (("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT) -> IO b)
-> IO b
forall a b. (a -> b) -> a -> b
$ \p :: "pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p -> ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> CalibratedTimestampInfoEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct "pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p CalibratedTimestampInfoEXT
x (("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT) -> IO b
f "pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p)
  pokeCStruct :: ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> CalibratedTimestampInfoEXT -> IO b -> IO b
pokeCStruct p :: "pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p CalibratedTimestampInfoEXT{..} f :: IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    ("pTimeDomains" ::: Ptr TimeDomainEXT) -> TimeDomainEXT -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> Int -> "pTimeDomains" ::: Ptr TimeDomainEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr TimeDomainEXT)) (TimeDomainEXT
timeDomain)
    IO b
f
  cStructSize :: Int
cStructSize = 24
  cStructAlignment :: Int
cStructAlignment = 8
  pokeZeroCStruct :: ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> IO b -> IO b
pokeZeroCStruct p :: "pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p f :: IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    ("pTimeDomains" ::: Ptr TimeDomainEXT) -> TimeDomainEXT -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> Int -> "pTimeDomains" ::: Ptr TimeDomainEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr TimeDomainEXT)) (TimeDomainEXT
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct CalibratedTimestampInfoEXT where
  peekCStruct :: ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> IO CalibratedTimestampInfoEXT
peekCStruct p :: "pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p = do
    TimeDomainEXT
timeDomain <- ("pTimeDomains" ::: Ptr TimeDomainEXT) -> IO TimeDomainEXT
forall a. Storable a => Ptr a -> IO a
peek @TimeDomainEXT (("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
p ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> Int -> "pTimeDomains" ::: Ptr TimeDomainEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr TimeDomainEXT))
    CalibratedTimestampInfoEXT -> IO CalibratedTimestampInfoEXT
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CalibratedTimestampInfoEXT -> IO CalibratedTimestampInfoEXT)
-> CalibratedTimestampInfoEXT -> IO CalibratedTimestampInfoEXT
forall a b. (a -> b) -> a -> b
$ TimeDomainEXT -> CalibratedTimestampInfoEXT
CalibratedTimestampInfoEXT
             TimeDomainEXT
timeDomain

instance Storable CalibratedTimestampInfoEXT where
  sizeOf :: CalibratedTimestampInfoEXT -> Int
sizeOf ~CalibratedTimestampInfoEXT
_ = 24
  alignment :: CalibratedTimestampInfoEXT -> Int
alignment ~CalibratedTimestampInfoEXT
_ = 8
  peek :: ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> IO CalibratedTimestampInfoEXT
peek = ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> IO CalibratedTimestampInfoEXT
forall a. FromCStruct a => Ptr a -> IO a
peekCStruct
  poke :: ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> CalibratedTimestampInfoEXT -> IO ()
poke ptr :: "pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
ptr poked :: CalibratedTimestampInfoEXT
poked = ("pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT)
-> CalibratedTimestampInfoEXT -> IO () -> IO ()
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct "pTimestampInfos" ::: Ptr CalibratedTimestampInfoEXT
ptr CalibratedTimestampInfoEXT
poked (() -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())

instance Zero CalibratedTimestampInfoEXT where
  zero :: CalibratedTimestampInfoEXT
zero = TimeDomainEXT -> CalibratedTimestampInfoEXT
CalibratedTimestampInfoEXT
           TimeDomainEXT
forall a. Zero a => a
zero


-- | VkTimeDomainEXT - Supported time domains
--
-- = Description
--
-- > struct timespec tv;
-- > clock_gettime(CLOCK_MONOTONIC, &tv);
-- > return tv.tv_nsec + tv.tv_sec*1000000000ull;
--
-- > struct timespec tv;
-- > clock_gettime(CLOCK_MONOTONIC_RAW, &tv);
-- > return tv.tv_nsec + tv.tv_sec*1000000000ull;
--
-- > LARGE_INTEGER counter;
-- > QueryPerformanceCounter(&counter);
-- > return counter.QuadPart;
--
-- = See Also
--
-- 'CalibratedTimestampInfoEXT',
-- 'getPhysicalDeviceCalibrateableTimeDomainsEXT'
newtype TimeDomainEXT = TimeDomainEXT Int32
  deriving newtype (TimeDomainEXT -> TimeDomainEXT -> Bool
(TimeDomainEXT -> TimeDomainEXT -> Bool)
-> (TimeDomainEXT -> TimeDomainEXT -> Bool) -> Eq TimeDomainEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TimeDomainEXT -> TimeDomainEXT -> Bool
$c/= :: TimeDomainEXT -> TimeDomainEXT -> Bool
== :: TimeDomainEXT -> TimeDomainEXT -> Bool
$c== :: TimeDomainEXT -> TimeDomainEXT -> Bool
Eq, Eq TimeDomainEXT
Eq TimeDomainEXT =>
(TimeDomainEXT -> TimeDomainEXT -> Ordering)
-> (TimeDomainEXT -> TimeDomainEXT -> Bool)
-> (TimeDomainEXT -> TimeDomainEXT -> Bool)
-> (TimeDomainEXT -> TimeDomainEXT -> Bool)
-> (TimeDomainEXT -> TimeDomainEXT -> Bool)
-> (TimeDomainEXT -> TimeDomainEXT -> TimeDomainEXT)
-> (TimeDomainEXT -> TimeDomainEXT -> TimeDomainEXT)
-> Ord TimeDomainEXT
TimeDomainEXT -> TimeDomainEXT -> Bool
TimeDomainEXT -> TimeDomainEXT -> Ordering
TimeDomainEXT -> TimeDomainEXT -> TimeDomainEXT
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: TimeDomainEXT -> TimeDomainEXT -> TimeDomainEXT
$cmin :: TimeDomainEXT -> TimeDomainEXT -> TimeDomainEXT
max :: TimeDomainEXT -> TimeDomainEXT -> TimeDomainEXT
$cmax :: TimeDomainEXT -> TimeDomainEXT -> TimeDomainEXT
>= :: TimeDomainEXT -> TimeDomainEXT -> Bool
$c>= :: TimeDomainEXT -> TimeDomainEXT -> Bool
> :: TimeDomainEXT -> TimeDomainEXT -> Bool
$c> :: TimeDomainEXT -> TimeDomainEXT -> Bool
<= :: TimeDomainEXT -> TimeDomainEXT -> Bool
$c<= :: TimeDomainEXT -> TimeDomainEXT -> Bool
< :: TimeDomainEXT -> TimeDomainEXT -> Bool
$c< :: TimeDomainEXT -> TimeDomainEXT -> Bool
compare :: TimeDomainEXT -> TimeDomainEXT -> Ordering
$ccompare :: TimeDomainEXT -> TimeDomainEXT -> Ordering
$cp1Ord :: Eq TimeDomainEXT
Ord, Ptr b -> Int -> IO TimeDomainEXT
Ptr b -> Int -> TimeDomainEXT -> IO ()
("pTimeDomains" ::: Ptr TimeDomainEXT) -> IO TimeDomainEXT
("pTimeDomains" ::: Ptr TimeDomainEXT) -> Int -> IO TimeDomainEXT
("pTimeDomains" ::: Ptr TimeDomainEXT)
-> Int -> TimeDomainEXT -> IO ()
("pTimeDomains" ::: Ptr TimeDomainEXT) -> TimeDomainEXT -> IO ()
TimeDomainEXT -> Int
(TimeDomainEXT -> Int)
-> (TimeDomainEXT -> Int)
-> (("pTimeDomains" ::: Ptr TimeDomainEXT)
    -> Int -> IO TimeDomainEXT)
-> (("pTimeDomains" ::: Ptr TimeDomainEXT)
    -> Int -> TimeDomainEXT -> IO ())
-> (forall b. Ptr b -> Int -> IO TimeDomainEXT)
-> (forall b. Ptr b -> Int -> TimeDomainEXT -> IO ())
-> (("pTimeDomains" ::: Ptr TimeDomainEXT) -> IO TimeDomainEXT)
-> (("pTimeDomains" ::: Ptr TimeDomainEXT)
    -> TimeDomainEXT -> IO ())
-> Storable TimeDomainEXT
forall b. Ptr b -> Int -> IO TimeDomainEXT
forall b. Ptr b -> Int -> TimeDomainEXT -> IO ()
forall a.
(a -> Int)
-> (a -> Int)
-> (Ptr a -> Int -> IO a)
-> (Ptr a -> Int -> a -> IO ())
-> (forall b. Ptr b -> Int -> IO a)
-> (forall b. Ptr b -> Int -> a -> IO ())
-> (Ptr a -> IO a)
-> (Ptr a -> a -> IO ())
-> Storable a
poke :: ("pTimeDomains" ::: Ptr TimeDomainEXT) -> TimeDomainEXT -> IO ()
$cpoke :: ("pTimeDomains" ::: Ptr TimeDomainEXT) -> TimeDomainEXT -> IO ()
peek :: ("pTimeDomains" ::: Ptr TimeDomainEXT) -> IO TimeDomainEXT
$cpeek :: ("pTimeDomains" ::: Ptr TimeDomainEXT) -> IO TimeDomainEXT
pokeByteOff :: Ptr b -> Int -> TimeDomainEXT -> IO ()
$cpokeByteOff :: forall b. Ptr b -> Int -> TimeDomainEXT -> IO ()
peekByteOff :: Ptr b -> Int -> IO TimeDomainEXT
$cpeekByteOff :: forall b. Ptr b -> Int -> IO TimeDomainEXT
pokeElemOff :: ("pTimeDomains" ::: Ptr TimeDomainEXT)
-> Int -> TimeDomainEXT -> IO ()
$cpokeElemOff :: ("pTimeDomains" ::: Ptr TimeDomainEXT)
-> Int -> TimeDomainEXT -> IO ()
peekElemOff :: ("pTimeDomains" ::: Ptr TimeDomainEXT) -> Int -> IO TimeDomainEXT
$cpeekElemOff :: ("pTimeDomains" ::: Ptr TimeDomainEXT) -> Int -> IO TimeDomainEXT
alignment :: TimeDomainEXT -> Int
$calignment :: TimeDomainEXT -> Int
sizeOf :: TimeDomainEXT -> Int
$csizeOf :: TimeDomainEXT -> Int
Storable, TimeDomainEXT
TimeDomainEXT -> Zero TimeDomainEXT
forall a. a -> Zero a
zero :: TimeDomainEXT
$czero :: TimeDomainEXT
Zero)

-- | 'TIME_DOMAIN_DEVICE_EXT' specifies the device time domain. Timestamp
-- values in this time domain use the same units and are comparable with
-- device timestamp values captured using
-- 'Vulkan.Core10.CommandBufferBuilding.cmdWriteTimestamp' and are defined
-- to be incrementing according to the
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#limits-timestampPeriod timestampPeriod>
-- of the device.
pattern $bTIME_DOMAIN_DEVICE_EXT :: TimeDomainEXT
$mTIME_DOMAIN_DEVICE_EXT :: forall r. TimeDomainEXT -> (Void# -> r) -> (Void# -> r) -> r
TIME_DOMAIN_DEVICE_EXT = TimeDomainEXT 0
-- | 'TIME_DOMAIN_CLOCK_MONOTONIC_EXT' specifies the CLOCK_MONOTONIC time
-- domain available on POSIX platforms. Timestamp values in this time
-- domain are in units of nanoseconds and are comparable with platform
-- timestamp values captured using the POSIX clock_gettime API as computed
-- by this example:
pattern $bTIME_DOMAIN_CLOCK_MONOTONIC_EXT :: TimeDomainEXT
$mTIME_DOMAIN_CLOCK_MONOTONIC_EXT :: forall r. TimeDomainEXT -> (Void# -> r) -> (Void# -> r) -> r
TIME_DOMAIN_CLOCK_MONOTONIC_EXT = TimeDomainEXT 1
-- | 'TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT' specifies the CLOCK_MONOTONIC_RAW
-- time domain available on POSIX platforms. Timestamp values in this time
-- domain are in units of nanoseconds and are comparable with platform
-- timestamp values captured using the POSIX clock_gettime API as computed
-- by this example:
pattern $bTIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT :: TimeDomainEXT
$mTIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT :: forall r. TimeDomainEXT -> (Void# -> r) -> (Void# -> r) -> r
TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT = TimeDomainEXT 2
-- | 'TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT' specifies the performance
-- counter (QPC) time domain available on Windows. Timestamp values in this
-- time domain are in the same units as those provided by the Windows
-- QueryPerformanceCounter API and are comparable with platform timestamp
-- values captured using that API as computed by this example:
pattern $bTIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT :: TimeDomainEXT
$mTIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT :: forall r. TimeDomainEXT -> (Void# -> r) -> (Void# -> r) -> r
TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT = TimeDomainEXT 3
{-# complete TIME_DOMAIN_DEVICE_EXT,
             TIME_DOMAIN_CLOCK_MONOTONIC_EXT,
             TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT,
             TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT :: TimeDomainEXT #-}

instance Show TimeDomainEXT where
  showsPrec :: Int -> TimeDomainEXT -> ShowS
showsPrec p :: Int
p = \case
    TIME_DOMAIN_DEVICE_EXT -> String -> ShowS
showString "TIME_DOMAIN_DEVICE_EXT"
    TIME_DOMAIN_CLOCK_MONOTONIC_EXT -> String -> ShowS
showString "TIME_DOMAIN_CLOCK_MONOTONIC_EXT"
    TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT -> String -> ShowS
showString "TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT"
    TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT -> String -> ShowS
showString "TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT"
    TimeDomainEXT x :: Int32
x -> Bool -> ShowS -> ShowS
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= 11) (String -> ShowS
showString "TimeDomainEXT " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int32 -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec 11 Int32
x)

instance Read TimeDomainEXT where
  readPrec :: ReadPrec TimeDomainEXT
readPrec = ReadPrec TimeDomainEXT -> ReadPrec TimeDomainEXT
forall a. ReadPrec a -> ReadPrec a
parens ([(String, ReadPrec TimeDomainEXT)] -> ReadPrec TimeDomainEXT
forall a. [(String, ReadPrec a)] -> ReadPrec a
choose [("TIME_DOMAIN_DEVICE_EXT", TimeDomainEXT -> ReadPrec TimeDomainEXT
forall (f :: * -> *) a. Applicative f => a -> f a
pure TimeDomainEXT
TIME_DOMAIN_DEVICE_EXT)
                            , ("TIME_DOMAIN_CLOCK_MONOTONIC_EXT", TimeDomainEXT -> ReadPrec TimeDomainEXT
forall (f :: * -> *) a. Applicative f => a -> f a
pure TimeDomainEXT
TIME_DOMAIN_CLOCK_MONOTONIC_EXT)
                            , ("TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT", TimeDomainEXT -> ReadPrec TimeDomainEXT
forall (f :: * -> *) a. Applicative f => a -> f a
pure TimeDomainEXT
TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT)
                            , ("TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT", TimeDomainEXT -> ReadPrec TimeDomainEXT
forall (f :: * -> *) a. Applicative f => a -> f a
pure TimeDomainEXT
TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT)]
                     ReadPrec TimeDomainEXT
-> ReadPrec TimeDomainEXT -> ReadPrec TimeDomainEXT
forall a. ReadPrec a -> ReadPrec a -> ReadPrec a
+++
                     Int -> ReadPrec TimeDomainEXT -> ReadPrec TimeDomainEXT
forall a. Int -> ReadPrec a -> ReadPrec a
prec 10 (do
                       Lexeme -> ReadPrec ()
expectP (String -> Lexeme
Ident "TimeDomainEXT")
                       Int32
v <- ReadPrec Int32 -> ReadPrec Int32
forall a. ReadPrec a -> ReadPrec a
step ReadPrec Int32
forall a. Read a => ReadPrec a
readPrec
                       TimeDomainEXT -> ReadPrec TimeDomainEXT
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int32 -> TimeDomainEXT
TimeDomainEXT Int32
v)))


type EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION = 1

-- No documentation found for TopLevel "VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION"
pattern EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION :: forall a . Integral a => a
pattern $bEXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION :: a
$mEXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION :: forall r a. Integral a => a -> (Void# -> r) -> (Void# -> r) -> r
EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION = 1


type EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME = "VK_EXT_calibrated_timestamps"

-- No documentation found for TopLevel "VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME"
pattern EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $bEXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME :: a
$mEXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME :: forall r a.
(Eq a, IsString a) =>
a -> (Void# -> r) -> (Void# -> r) -> r
EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME = "VK_EXT_calibrated_timestamps"