{-# language CPP #-}
module Graphics.Vulkan.Core10.Enums.MemoryPropertyFlagBits  ( MemoryPropertyFlagBits( MEMORY_PROPERTY_DEVICE_LOCAL_BIT
                                                                                    , MEMORY_PROPERTY_HOST_VISIBLE_BIT
                                                                                    , MEMORY_PROPERTY_HOST_COHERENT_BIT
                                                                                    , MEMORY_PROPERTY_HOST_CACHED_BIT
                                                                                    , MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT
                                                                                    , MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD
                                                                                    , MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD
                                                                                    , MEMORY_PROPERTY_PROTECTED_BIT
                                                                                    , ..
                                                                                    )
                                                            , MemoryPropertyFlags
                                                            ) 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)
-- | VkMemoryPropertyFlagBits - Bitmask specifying properties for a memory
-- type
--
-- = Description
--
-- For any memory allocated with both the
-- 'MEMORY_PROPERTY_HOST_COHERENT_BIT' and the
-- 'MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD', host or device accesses also
-- perform automatic memory domain transfer operations, such that writes
-- are always automatically available and visible to both host and device
-- memory domains.
--
-- Note
--
-- Device coherence is a useful property for certain debugging use cases
-- (e.g. crash analysis, where performing separate coherence actions could
-- mean values are not reported correctly). However, device coherent
-- accesses may be slower than equivalent accesses without device
-- coherence, particularly if they are also device uncached. For device
-- uncached memory in particular, repeated accesses to the same or
-- neighbouring memory locations over a short time period (e.g. within a
-- frame) may be slower than it would be for the equivalent cached memory
-- type. As such, it is generally inadvisable to use device coherent or
-- device uncached memory except when really needed.
--
-- = See Also
--
-- 'MemoryPropertyFlags'
newtype MemoryPropertyFlagBits = MemoryPropertyFlagBits Flags
  deriving newtype (Eq, Ord, Storable, Zero, Bits)

-- | 'MEMORY_PROPERTY_DEVICE_LOCAL_BIT' bit specifies that memory allocated
-- with this type is the most efficient for device access. This property
-- will be set if and only if the memory type belongs to a heap with the
-- 'Graphics.Vulkan.Core10.Enums.MemoryHeapFlagBits.MEMORY_HEAP_DEVICE_LOCAL_BIT'
-- set.
pattern MEMORY_PROPERTY_DEVICE_LOCAL_BIT = MemoryPropertyFlagBits 0x00000001
-- | 'MEMORY_PROPERTY_HOST_VISIBLE_BIT' bit specifies that memory allocated
-- with this type /can/ be mapped for host access using
-- 'Graphics.Vulkan.Core10.Memory.mapMemory'.
pattern MEMORY_PROPERTY_HOST_VISIBLE_BIT = MemoryPropertyFlagBits 0x00000002
-- | 'MEMORY_PROPERTY_HOST_COHERENT_BIT' bit specifies that the host cache
-- management commands
-- 'Graphics.Vulkan.Core10.Memory.flushMappedMemoryRanges' and
-- 'Graphics.Vulkan.Core10.Memory.invalidateMappedMemoryRanges' are not
-- needed to flush host writes to the device or make device writes visible
-- to the host, respectively.
pattern MEMORY_PROPERTY_HOST_COHERENT_BIT = MemoryPropertyFlagBits 0x00000004
-- | 'MEMORY_PROPERTY_HOST_CACHED_BIT' bit specifies that memory allocated
-- with this type is cached on the host. Host memory accesses to uncached
-- memory are slower than to cached memory, however uncached memory is
-- always host coherent.
pattern MEMORY_PROPERTY_HOST_CACHED_BIT = MemoryPropertyFlagBits 0x00000008
-- | 'MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT' bit specifies that the memory
-- type only allows device access to the memory. Memory types /must/ not
-- have both 'MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT' and
-- 'MEMORY_PROPERTY_HOST_VISIBLE_BIT' set. Additionally, the object’s
-- backing memory /may/ be provided by the implementation lazily as
-- specified in
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#memory-device-lazy_allocation Lazily Allocated Memory>.
pattern MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = MemoryPropertyFlagBits 0x00000010
-- | 'MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD' bit specifies that memory
-- allocated with this type is not cached on the device. Uncached device
-- memory is always device coherent.
pattern MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD = MemoryPropertyFlagBits 0x00000080
-- | 'MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD' bit specifies that device
-- accesses to allocations of this memory type are automatically made
-- available and visible.
pattern MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD = MemoryPropertyFlagBits 0x00000040
-- | 'MEMORY_PROPERTY_PROTECTED_BIT' bit specifies that the memory type only
-- allows device access to the memory, and allows protected queue
-- operations to access the memory. Memory types /must/ not have
-- 'MEMORY_PROPERTY_PROTECTED_BIT' set and any of
-- 'MEMORY_PROPERTY_HOST_VISIBLE_BIT' set, or
-- 'MEMORY_PROPERTY_HOST_COHERENT_BIT' set, or
-- 'MEMORY_PROPERTY_HOST_CACHED_BIT' set.
pattern MEMORY_PROPERTY_PROTECTED_BIT = MemoryPropertyFlagBits 0x00000020

type MemoryPropertyFlags = MemoryPropertyFlagBits

instance Show MemoryPropertyFlagBits where
  showsPrec p = \case
    MEMORY_PROPERTY_DEVICE_LOCAL_BIT -> showString "MEMORY_PROPERTY_DEVICE_LOCAL_BIT"
    MEMORY_PROPERTY_HOST_VISIBLE_BIT -> showString "MEMORY_PROPERTY_HOST_VISIBLE_BIT"
    MEMORY_PROPERTY_HOST_COHERENT_BIT -> showString "MEMORY_PROPERTY_HOST_COHERENT_BIT"
    MEMORY_PROPERTY_HOST_CACHED_BIT -> showString "MEMORY_PROPERTY_HOST_CACHED_BIT"
    MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT -> showString "MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT"
    MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD -> showString "MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD"
    MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD -> showString "MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD"
    MEMORY_PROPERTY_PROTECTED_BIT -> showString "MEMORY_PROPERTY_PROTECTED_BIT"
    MemoryPropertyFlagBits x -> showParen (p >= 11) (showString "MemoryPropertyFlagBits 0x" . showHex x)

instance Read MemoryPropertyFlagBits where
  readPrec = parens (choose [("MEMORY_PROPERTY_DEVICE_LOCAL_BIT", pure MEMORY_PROPERTY_DEVICE_LOCAL_BIT)
                            , ("MEMORY_PROPERTY_HOST_VISIBLE_BIT", pure MEMORY_PROPERTY_HOST_VISIBLE_BIT)
                            , ("MEMORY_PROPERTY_HOST_COHERENT_BIT", pure MEMORY_PROPERTY_HOST_COHERENT_BIT)
                            , ("MEMORY_PROPERTY_HOST_CACHED_BIT", pure MEMORY_PROPERTY_HOST_CACHED_BIT)
                            , ("MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT", pure MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)
                            , ("MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD", pure MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD)
                            , ("MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD", pure MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD)
                            , ("MEMORY_PROPERTY_PROTECTED_BIT", pure MEMORY_PROPERTY_PROTECTED_BIT)]
                     +++
                     prec 10 (do
                       expectP (Ident "MemoryPropertyFlagBits")
                       v <- step readPrec
                       pure (MemoryPropertyFlagBits v)))