vulkan-2.0.0.1: src/Graphics/Vulkan/Core10/Fence.hs
{-# language Strict #-}
{-# language CPP #-}
{-# language GeneralizedNewtypeDeriving #-}
{-# language PatternSynonyms #-}
{-# language DataKinds #-}
{-# language TypeOperators #-}
{-# language DuplicateRecordFields #-}
module Graphics.Vulkan.Core10.Fence
( VkFenceCreateFlagBits(..)
, pattern VK_FENCE_CREATE_SIGNALED_BIT
, vkCreateFence
, vkDestroyFence
, vkResetFences
, vkGetFenceStatus
, vkWaitForFences
, VkFenceCreateInfo(..)
, VkFenceCreateFlags
) where
import Data.Bits
( Bits
, FiniteBits
)
import Data.Word
( Word64
, Word32
)
import Foreign.Ptr
( plusPtr
, Ptr
)
import Foreign.Storable
( Storable(..)
, Storable
)
import GHC.Read
( expectP
, choose
)
import Graphics.Vulkan.NamedType
( (:::)
)
import Text.ParserCombinators.ReadPrec
( (+++)
, prec
, step
)
import Text.Read
( Read(..)
, parens
)
import Text.Read.Lex
( Lexeme(Ident)
)
import Graphics.Vulkan.Core10.Core
( VkStructureType(..)
, VkBool32(..)
, VkResult(..)
, VkFlags
)
import Graphics.Vulkan.Core10.DeviceInitialization
( VkAllocationCallbacks(..)
, VkDevice
)
import Graphics.Vulkan.Core10.Queue
( VkFence
)
-- ** VkFenceCreateFlagBits
-- | VkFenceCreateFlagBits - Bitmask specifying initial state and behavior of
-- a fence
--
-- = See Also
--
-- 'VkFenceCreateFlags'
newtype VkFenceCreateFlagBits = VkFenceCreateFlagBits VkFlags
deriving (Eq, Ord, Storable, Bits, FiniteBits)
instance Show VkFenceCreateFlagBits where
showsPrec _ VK_FENCE_CREATE_SIGNALED_BIT = showString "VK_FENCE_CREATE_SIGNALED_BIT"
showsPrec p (VkFenceCreateFlagBits x) = showParen (p >= 11) (showString "VkFenceCreateFlagBits " . showsPrec 11 x)
instance Read VkFenceCreateFlagBits where
readPrec = parens ( choose [ ("VK_FENCE_CREATE_SIGNALED_BIT", pure VK_FENCE_CREATE_SIGNALED_BIT)
] +++
prec 10 (do
expectP (Ident "VkFenceCreateFlagBits")
v <- step readPrec
pure (VkFenceCreateFlagBits v)
)
)
-- | @VK_FENCE_CREATE_SIGNALED_BIT@ specifies that the fence object is
-- created in the signaled state. Otherwise, it is created in the
-- unsignaled state.
pattern VK_FENCE_CREATE_SIGNALED_BIT :: VkFenceCreateFlagBits
pattern VK_FENCE_CREATE_SIGNALED_BIT = VkFenceCreateFlagBits 0x00000001
-- | vkCreateFence - Create a new fence object
--
-- = Parameters
--
-- - @device@ is the logical device that creates the fence.
--
-- - @pCreateInfo@ is a pointer to an instance of the @VkFenceCreateInfo@
-- structure which contains information about how the fence is to be
-- created.
--
-- - @pAllocator@ controls host memory allocation as described in the
-- [Memory
-- Allocation](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#memory-allocation)
-- chapter.
--
-- - @pFence@ points to a handle in which the resulting fence object is
-- returned.
--
-- == Valid Usage (Implicit)
--
-- - @device@ /must/ be a valid @VkDevice@ handle
--
-- - @pCreateInfo@ /must/ be a valid pointer to a valid
-- @VkFenceCreateInfo@ structure
--
-- - If @pAllocator@ is not @NULL@, @pAllocator@ /must/ be a valid
-- pointer to a valid @VkAllocationCallbacks@ structure
--
-- - @pFence@ /must/ be a valid pointer to a @VkFence@ handle
--
-- == Return Codes
--
-- [[Success](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#fundamentals-successcodes)]
-- - @VK_SUCCESS@
--
-- [[Failure](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#fundamentals-errorcodes)]
-- - @VK_ERROR_OUT_OF_HOST_MEMORY@
--
-- - @VK_ERROR_OUT_OF_DEVICE_MEMORY@
--
-- = See Also
--
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkAllocationCallbacks',
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkDevice',
-- 'Graphics.Vulkan.Core10.Queue.VkFence', 'VkFenceCreateInfo'
foreign import ccall "vkCreateFence" vkCreateFence :: ("device" ::: VkDevice) -> ("pCreateInfo" ::: Ptr VkFenceCreateInfo) -> ("pAllocator" ::: Ptr VkAllocationCallbacks) -> ("pFence" ::: Ptr VkFence) -> IO VkResult
-- | vkDestroyFence - Destroy a fence object
--
-- = Parameters
--
-- - @device@ is the logical device that destroys the fence.
--
-- - @fence@ is the handle of the fence to destroy.
--
-- - @pAllocator@ controls host memory allocation as described in the
-- [Memory
-- Allocation](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#memory-allocation)
-- chapter.
--
-- == Valid Usage
--
-- - All [queue
-- submission](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#devsandqueues-submission)
-- commands that refer to @fence@ /must/ have completed execution
--
-- - If @VkAllocationCallbacks@ were provided when @fence@ was created, a
-- compatible set of callbacks /must/ be provided here
--
-- - If no @VkAllocationCallbacks@ were provided when @fence@ was
-- created, @pAllocator@ /must/ be @NULL@
--
-- == Valid Usage (Implicit)
--
-- - @device@ /must/ be a valid @VkDevice@ handle
--
-- - If @fence@ is not 'Graphics.Vulkan.Core10.Constants.VK_NULL_HANDLE',
-- @fence@ /must/ be a valid @VkFence@ handle
--
-- - If @pAllocator@ is not @NULL@, @pAllocator@ /must/ be a valid
-- pointer to a valid @VkAllocationCallbacks@ structure
--
-- - If @fence@ is a valid handle, it /must/ have been created,
-- allocated, or retrieved from @device@
--
-- == Host Synchronization
--
-- - Host access to @fence@ /must/ be externally synchronized
--
-- = See Also
--
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkAllocationCallbacks',
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkDevice',
-- 'Graphics.Vulkan.Core10.Queue.VkFence'
foreign import ccall "vkDestroyFence" vkDestroyFence :: ("device" ::: VkDevice) -> ("fence" ::: VkFence) -> ("pAllocator" ::: Ptr VkAllocationCallbacks) -> IO ()
-- | vkResetFences - Resets one or more fence objects
--
-- = Parameters
--
-- - @device@ is the logical device that owns the fences.
--
-- - @fenceCount@ is the number of fences to reset.
--
-- - @pFences@ is a pointer to an array of fence handles to reset.
--
-- = Description
--
-- If any member of @pFences@ currently has its [payload
-- imported](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#synchronization-fences-importing)
-- with temporary permanence, that fence’s prior permanent payload is first
-- restored. The remaining operations described therefore operate on the
-- restored payload.
--
-- When 'vkResetFences' is executed on the host, it defines a /fence
-- unsignal operation/ for each fence, which resets the fence to the
-- unsignaled state.
--
-- If any member of @pFences@ is already in the unsignaled state when
-- 'vkResetFences' is executed, then 'vkResetFences' has no effect on that
-- fence.
--
-- == Valid Usage
--
-- - Each element of @pFences@ /must/ not be currently associated with
-- any queue command that has not yet completed execution on that queue
--
-- == Valid Usage (Implicit)
--
-- - @device@ /must/ be a valid @VkDevice@ handle
--
-- - @pFences@ /must/ be a valid pointer to an array of @fenceCount@
-- valid @VkFence@ handles
--
-- - @fenceCount@ /must/ be greater than @0@
--
-- - Each element of @pFences@ /must/ have been created, allocated, or
-- retrieved from @device@
--
-- == Host Synchronization
--
-- - Host access to each member of @pFences@ /must/ be externally
-- synchronized
--
-- == Return Codes
--
-- [[Success](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#fundamentals-successcodes)]
-- - @VK_SUCCESS@
--
-- [[Failure](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#fundamentals-errorcodes)]
-- - @VK_ERROR_OUT_OF_HOST_MEMORY@
--
-- - @VK_ERROR_OUT_OF_DEVICE_MEMORY@
--
-- = See Also
--
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkDevice',
-- 'Graphics.Vulkan.Core10.Queue.VkFence'
foreign import ccall "vkResetFences" vkResetFences :: ("device" ::: VkDevice) -> ("fenceCount" ::: Word32) -> ("pFences" ::: Ptr VkFence) -> IO VkResult
-- | vkGetFenceStatus - Return the status of a fence
--
-- = Parameters
--
-- - @device@ is the logical device that owns the fence.
--
-- - @fence@ is the handle of the fence to query.
--
-- = Description
--
-- Upon success, @vkGetFenceStatus@ returns the status of the fence object,
-- with the following return codes:
--
-- +-----------------------------------+-------------------------------------------------------------------------------------------------------------------+
-- | Status | Meaning |
-- +===================================+===================================================================================================================+
-- | @VK_SUCCESS@ | The fence specified by @fence@ is signaled. |
-- +-----------------------------------+-------------------------------------------------------------------------------------------------------------------+
-- | @VK_NOT_READY@ | The fence specified by @fence@ is unsignaled. |
-- +-----------------------------------+-------------------------------------------------------------------------------------------------------------------+
-- | @VK_ERROR_DEVICE_LOST@ | The device has been lost. See [Lost |
-- | | Device](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#devsandqueues-lost-device). |
-- +-----------------------------------+-------------------------------------------------------------------------------------------------------------------+
--
-- Fence Object Status Codes
--
-- If a [queue
-- submission](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#devsandqueues-submission)
-- command is pending execution, then the value returned by this command
-- /may/ immediately be out of date.
--
-- If the device has been lost (see [Lost
-- Device](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#devsandqueues-lost-device)),
-- @vkGetFenceStatus@ /may/ return any of the above status codes. If the
-- device has been lost and @vkGetFenceStatus@ is called repeatedly, it
-- will eventually return either @VK_SUCCESS@ or @VK_ERROR_DEVICE_LOST@.
--
-- == Valid Usage (Implicit)
--
-- - @device@ /must/ be a valid @VkDevice@ handle
--
-- - @fence@ /must/ be a valid @VkFence@ handle
--
-- - @fence@ /must/ have been created, allocated, or retrieved from
-- @device@
--
-- == Return Codes
--
-- [[Success](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#fundamentals-successcodes)]
-- - @VK_SUCCESS@
--
-- - @VK_NOT_READY@
--
-- [[Failure](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#fundamentals-errorcodes)]
-- - @VK_ERROR_OUT_OF_HOST_MEMORY@
--
-- - @VK_ERROR_OUT_OF_DEVICE_MEMORY@
--
-- - @VK_ERROR_DEVICE_LOST@
--
-- = See Also
--
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkDevice',
-- 'Graphics.Vulkan.Core10.Queue.VkFence'
foreign import ccall "vkGetFenceStatus" vkGetFenceStatus :: ("device" ::: VkDevice) -> ("fence" ::: VkFence) -> IO VkResult
-- | vkWaitForFences - Wait for one or more fences to become signaled
--
-- = Parameters
--
-- - @device@ is the logical device that owns the fences.
--
-- - @fenceCount@ is the number of fences to wait on.
--
-- - @pFences@ is a pointer to an array of @fenceCount@ fence handles.
--
-- - @waitAll@ is the condition that /must/ be satisfied to successfully
-- unblock the wait. If @waitAll@ is @VK_TRUE@, then the condition is
-- that all fences in @pFences@ are signaled. Otherwise, the condition
-- is that at least one fence in @pFences@ is signaled.
--
-- - @timeout@ is the timeout period in units of nanoseconds. @timeout@
-- is adjusted to the closest value allowed by the
-- implementation-dependent timeout accuracy, which /may/ be
-- substantially longer than one nanosecond, and /may/ be longer than
-- the requested period.
--
-- = Description
--
-- If the condition is satisfied when @vkWaitForFences@ is called, then
-- @vkWaitForFences@ returns immediately. If the condition is not satisfied
-- at the time @vkWaitForFences@ is called, then @vkWaitForFences@ will
-- block and wait up to @timeout@ nanoseconds for the condition to become
-- satisfied.
--
-- If @timeout@ is zero, then @vkWaitForFences@ does not wait, but simply
-- returns the current state of the fences. @VK_TIMEOUT@ will be returned
-- in this case if the condition is not satisfied, even though no actual
-- wait was performed.
--
-- If the specified timeout period expires before the condition is
-- satisfied, @vkWaitForFences@ returns @VK_TIMEOUT@. If the condition is
-- satisfied before @timeout@ nanoseconds has expired, @vkWaitForFences@
-- returns @VK_SUCCESS@.
--
-- If device loss occurs (see [Lost
-- Device](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#devsandqueues-lost-device))
-- before the timeout has expired, @vkWaitForFences@ /must/ return in
-- finite time with either @VK_SUCCESS@ or @VK_ERROR_DEVICE_LOST@.
--
-- __Note__
--
-- While we guarantee that @vkWaitForFences@ /must/ return in finite time,
-- no guarantees are made that it returns immediately upon device loss.
-- However, the client can reasonably expect that the delay will be on the
-- order of seconds and that calling @vkWaitForFences@ will not result in a
-- permanently (or seemingly permanently) dead process.
--
-- == Valid Usage (Implicit)
--
-- - @device@ /must/ be a valid @VkDevice@ handle
--
-- - @pFences@ /must/ be a valid pointer to an array of @fenceCount@
-- valid @VkFence@ handles
--
-- - @fenceCount@ /must/ be greater than @0@
--
-- - Each element of @pFences@ /must/ have been created, allocated, or
-- retrieved from @device@
--
-- == Return Codes
--
-- [[Success](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#fundamentals-successcodes)]
-- - @VK_SUCCESS@
--
-- - @VK_TIMEOUT@
--
-- [[Failure](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#fundamentals-errorcodes)]
-- - @VK_ERROR_OUT_OF_HOST_MEMORY@
--
-- - @VK_ERROR_OUT_OF_DEVICE_MEMORY@
--
-- - @VK_ERROR_DEVICE_LOST@
--
-- = See Also
--
-- @VkBool32@, 'Graphics.Vulkan.Core10.DeviceInitialization.VkDevice',
-- 'Graphics.Vulkan.Core10.Queue.VkFence'
foreign import ccall "vkWaitForFences" vkWaitForFences :: ("device" ::: VkDevice) -> ("fenceCount" ::: Word32) -> ("pFences" ::: Ptr VkFence) -> ("waitAll" ::: VkBool32) -> ("timeout" ::: Word64) -> IO VkResult
-- | VkFenceCreateInfo - Structure specifying parameters of a newly created
-- fence
--
-- == Valid Usage (Implicit)
--
-- - @sType@ /must/ be @VK_STRUCTURE_TYPE_FENCE_CREATE_INFO@
--
-- - Each @pNext@ member of any structure (including this one) in the
-- @pNext@ chain /must/ be either @NULL@ or a pointer to a valid
-- instance of
-- 'Graphics.Vulkan.Core11.Promoted_from_VK_KHR_external_fence.VkExportFenceCreateInfo'
-- or
-- 'Graphics.Vulkan.Extensions.VK_KHR_external_fence_win32.VkExportFenceWin32HandleInfoKHR'
--
-- - Each @sType@ member in the @pNext@ chain /must/ be unique
--
-- - @flags@ /must/ be a valid combination of 'VkFenceCreateFlagBits'
-- values
--
-- = See Also
--
-- 'VkFenceCreateFlags', 'Graphics.Vulkan.Core10.Core.VkStructureType',
-- 'vkCreateFence'
data VkFenceCreateInfo = VkFenceCreateInfo
{ -- | @sType@ is the type of this structure.
vkSType :: VkStructureType
, -- | @pNext@ is @NULL@ or a pointer to an extension-specific structure.
vkPNext :: Ptr ()
, -- | @flags@ is a bitmask of 'VkFenceCreateFlagBits' specifying the initial
-- state and behavior of the fence.
vkFlags :: VkFenceCreateFlags
}
deriving (Eq, Show)
instance Storable VkFenceCreateInfo where
sizeOf ~_ = 24
alignment ~_ = 8
peek ptr = VkFenceCreateInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkFenceCreateInfo))
*> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkFenceCreateInfo))
*> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkFenceCreateInfo))
-- | VkFenceCreateFlags - Bitmask of VkFenceCreateFlagBits
--
-- = Description
--
-- @VkFenceCreateFlags@ is a bitmask type for setting a mask of zero or
-- more 'VkFenceCreateFlagBits'.
--
-- = See Also
--
-- 'VkFenceCreateFlagBits', 'VkFenceCreateInfo'
type VkFenceCreateFlags = VkFenceCreateFlagBits