{-# language CPP #-}
module Graphics.Vulkan.Core11.Enums.ExternalFenceHandleTypeFlagBits  ( ExternalFenceHandleTypeFlagBits( EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT
                                                                                                      , EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT
                                                                                                      , EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT
                                                                                                      , EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT
                                                                                                      , ..
                                                                                                      )
                                                                     , ExternalFenceHandleTypeFlags
                                                                     ) where

import GHC.Read (choose)
import GHC.Read (expectP)
import GHC.Read (parens)
import GHC.Show (showParen)
import GHC.Show (showString)
import Numeric (showHex)
import Text.ParserCombinators.ReadPrec ((+++))
import Text.ParserCombinators.ReadPrec (prec)
import Text.ParserCombinators.ReadPrec (step)
import Data.Bits (Bits)
import Foreign.Storable (Storable)
import GHC.Read (Read(readPrec))
import Text.Read.Lex (Lexeme(Ident))
import Graphics.Vulkan.Core10.BaseType (Flags)
import Graphics.Vulkan.Zero (Zero)
-- | VkExternalFenceHandleTypeFlagBits - Bitmask of valid external fence
-- handle types
--
-- = Description
--
-- Some external fence handle types can only be shared within the same
-- underlying physical device and\/or the same driver version, as defined
-- in the following table:
--
-- +---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+
-- | Handle type                                       | 'Graphics.Vulkan.Core11.Promoted_From_VK_KHR_external_memory_capabilities.PhysicalDeviceIDProperties'::@driverUUID@ | 'Graphics.Vulkan.Core11.Promoted_From_VK_KHR_external_memory_capabilities.PhysicalDeviceIDProperties'::@deviceUUID@ |
-- +---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+
-- | 'EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT'        | Must match                                                                                                          | Must match                                                                                                          |
-- +---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+
-- | 'EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT'     | Must match                                                                                                          | Must match                                                                                                          |
-- +---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+
-- | 'EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT' | Must match                                                                                                          | Must match                                                                                                          |
-- +---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+
-- | 'EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT'          | No restriction                                                                                                      | No restriction                                                                                                      |
-- +---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+
--
-- External fence handle types compatibility
--
-- = See Also
--
-- 'ExternalFenceHandleTypeFlags',
-- 'Graphics.Vulkan.Extensions.VK_KHR_external_fence_fd.FenceGetFdInfoKHR',
-- 'Graphics.Vulkan.Extensions.VK_KHR_external_fence_win32.FenceGetWin32HandleInfoKHR',
-- 'Graphics.Vulkan.Extensions.VK_KHR_external_fence_fd.ImportFenceFdInfoKHR',
-- 'Graphics.Vulkan.Extensions.VK_KHR_external_fence_win32.ImportFenceWin32HandleInfoKHR',
-- 'Graphics.Vulkan.Core11.Promoted_From_VK_KHR_external_fence_capabilities.PhysicalDeviceExternalFenceInfo'
newtype ExternalFenceHandleTypeFlagBits = ExternalFenceHandleTypeFlagBits Flags
  deriving newtype (Eq, Ord, Storable, Zero, Bits)

-- | 'EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT' specifies a POSIX file
-- descriptor handle that has only limited valid usage outside of Vulkan
-- and other compatible APIs. It /must/ be compatible with the POSIX system
-- calls @dup@, @dup2@, @close@, and the non-standard system call @dup3@.
-- Additionally, it /must/ be transportable over a socket using an
-- @SCM_RIGHTS@ control message. It owns a reference to the underlying
-- synchronization primitive represented by its Vulkan fence object.
pattern EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT = ExternalFenceHandleTypeFlagBits 0x00000001
-- | 'EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT' specifies an NT handle
-- that has only limited valid usage outside of Vulkan and other compatible
-- APIs. It /must/ be compatible with the functions @DuplicateHandle@,
-- @CloseHandle@, @CompareObjectHandles@, @GetHandleInformation@, and
-- @SetHandleInformation@. It owns a reference to the underlying
-- synchronization primitive represented by its Vulkan fence object.
pattern EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT = ExternalFenceHandleTypeFlagBits 0x00000002
-- | 'EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT' specifies a global
-- share handle that has only limited valid usage outside of Vulkan and
-- other compatible APIs. It is not compatible with any native APIs. It
-- does not own a reference to the underlying synchronization primitive
-- represented by its Vulkan fence object, and will therefore become
-- invalid when all Vulkan fence objects associated with it are destroyed.
pattern EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = ExternalFenceHandleTypeFlagBits 0x00000004
-- | 'EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT' specifies a POSIX file
-- descriptor handle to a Linux Sync File or Android Fence. It can be used
-- with any native API accepting a valid sync file or fence as input. It
-- owns a reference to the underlying synchronization primitive associated
-- with the file descriptor. Implementations which support importing this
-- handle type /must/ accept any type of sync or fence FD supported by the
-- native system they are running on.
pattern EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT = ExternalFenceHandleTypeFlagBits 0x00000008

type ExternalFenceHandleTypeFlags = ExternalFenceHandleTypeFlagBits

instance Show ExternalFenceHandleTypeFlagBits where
  showsPrec p = \case
    EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT -> showString "EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT"
    EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT -> showString "EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT"
    EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT -> showString "EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT"
    EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT -> showString "EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT"
    ExternalFenceHandleTypeFlagBits x -> showParen (p >= 11) (showString "ExternalFenceHandleTypeFlagBits 0x" . showHex x)

instance Read ExternalFenceHandleTypeFlagBits where
  readPrec = parens (choose [("EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT", pure EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT)
                            , ("EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT", pure EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT)
                            , ("EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT", pure EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
                            , ("EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT", pure EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT)]
                     +++
                     prec 10 (do
                       expectP (Ident "ExternalFenceHandleTypeFlagBits")
                       v <- step readPrec
                       pure (ExternalFenceHandleTypeFlagBits v)))