{-# language CPP #-}
-- | = Name
--
-- VK_EXT_memory_decompression - device extension
--
-- = VK_EXT_memory_decompression
--
-- [__Name String__]
--     @VK_EXT_memory_decompression@
--
-- [__Extension Type__]
--     Device extension
--
-- [__Registered Extension Number__]
--     551
--
-- [__Revision__]
--     1
--
-- [__Ratification Status__]
--     Ratified
--
-- [__Extension and Version Dependencies__]
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_get_physical_device_properties2 VK_KHR_get_physical_device_properties2>
--     and
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_buffer_device_address VK_KHR_buffer_device_address>
--
-- [__Contact__]
--
--     -   Vikram Kushwaha
--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?body=[VK_EXT_memory_decompression] @vkushwaha-nv%0A*Here describe the issue or question you have about the VK_EXT_memory_decompression extension* >
--
-- [__Extension Proposal__]
--     <https://github.com/KhronosGroup/Vulkan-Docs/tree/main/proposals/VK_EXT_memory_decompression.adoc VK_EXT_memory_decompression>
--
-- == Other Extension Metadata
--
-- [__Last Modified Date__]
--     2025-01-23
--
-- [__Contributors__]
--
--     -   Vikram Kushwaha, NVIDIA
--
--     -   Daniel Koch, NVIDIA
--
--     -   Jeff Bolz, NVIDIA
--
--     -   Christoph Kubisch, NVIDIA
--
--     -   Piers Daniell, NVIDIA
--
--     -   Spencer Fricke, LunarG
--
-- == Description
--
-- This extension adds support for performing memory to memory
-- decompression.
--
-- == New Commands
--
-- -   'cmdDecompressMemoryEXT'
--
-- -   'cmdDecompressMemoryIndirectCountEXT'
--
-- == New Structures
--
-- -   'DecompressMemoryInfoEXT'
--
-- -   'DecompressMemoryRegionEXT'
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
--     'Vulkan.Core10.Device.DeviceCreateInfo':
--
--     -   'PhysicalDeviceMemoryDecompressionFeaturesEXT'
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2':
--
--     -   'PhysicalDeviceMemoryDecompressionPropertiesEXT'
--
-- == New Enums
--
-- -   'MemoryDecompressionMethodFlagBitsEXT'
--
-- == New Bitmasks
--
-- -   'MemoryDecompressionMethodFlagsEXT'
--
-- == New Enum Constants
--
-- -   'EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME'
--
-- -   'EXT_MEMORY_DECOMPRESSION_SPEC_VERSION'
--
-- -   Extending 'Vulkan.Core13.Enums.AccessFlags2.AccessFlagBits2':
--
--     -   'Vulkan.Core13.Enums.AccessFlags2.ACCESS_2_MEMORY_DECOMPRESSION_READ_BIT_EXT'
--
--     -   'Vulkan.Core13.Enums.AccessFlags2.ACCESS_2_MEMORY_DECOMPRESSION_WRITE_BIT_EXT'
--
-- -   Extending
--     'Vulkan.Core14.Enums.BufferUsageFlags2.BufferUsageFlagBits2':
--
--     -   'Vulkan.Core14.Enums.BufferUsageFlags2.BUFFER_USAGE_2_MEMORY_DECOMPRESSION_BIT_EXT'
--
-- -   Extending
--     'Vulkan.Core13.Enums.PipelineStageFlags2.PipelineStageFlagBits2':
--
--     -   'Vulkan.Core13.Enums.PipelineStageFlags2.PIPELINE_STAGE_2_MEMORY_DECOMPRESSION_BIT_EXT'
--
-- -   Extending 'Vulkan.Core10.Enums.StructureType.StructureType':
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_DECOMPRESS_MEMORY_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_EXT'
--
-- == Issues
--
-- 1) How does an app know the minimum size that @decompressedSize@ should
-- be set to?
--
-- __RESOLVED__: When decompressing, data is typically processed in chunks.
-- For example, with GDeflate 1.0, data is streamed in 64 KB blocks, but
-- the final block may be smaller. The exact size of this last block
-- depends on the compression method and original data size and so it must
-- be stored in the compressed bitstream so that the decompressor can set
-- @decompressedSize@ correctly. It is still ok for the last block to take
-- up all 64 KB, but setting it too low will cause issues and is undefined
-- behavior. It is a known limitation that the validation layers will not
-- be able to detect the minimum size of @decompressedSize@ unless it
-- decides to implement each decompression method specification.
--
-- == Version History
--
-- -   Revision 1, 2025-01-23 (Daniel Koch)
--
--     -   Initial draft
--
-- == See Also
--
-- No cross-references are available
--
-- == Document Notes
--
-- For more information, see the
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VK_EXT_memory_decompression Vulkan Specification>.
--
-- This page is a generated document. Fixes and changes should be made to
-- the generator scripts, not directly.
module Vulkan.Extensions.VK_EXT_memory_decompression  ( cmdDecompressMemoryEXT
                                                      , cmdDecompressMemoryIndirectCountEXT
                                                      , pattern MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV
                                                      , PhysicalDeviceMemoryDecompressionFeaturesEXT(..)
                                                      , PhysicalDeviceMemoryDecompressionPropertiesEXT(..)
                                                      , DecompressMemoryRegionEXT(..)
                                                      , DecompressMemoryInfoEXT(..)
                                                      , MemoryDecompressionMethodFlagsEXT
                                                      , MemoryDecompressionMethodFlagBitsEXT( MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT
                                                                                            , ..
                                                                                            )
                                                      , EXT_MEMORY_DECOMPRESSION_SPEC_VERSION
                                                      , pattern EXT_MEMORY_DECOMPRESSION_SPEC_VERSION
                                                      , EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME
                                                      , pattern EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME
                                                      ) where

import Data.Bits (Bits)
import Data.Bits (FiniteBits)
import Vulkan.Internal.Utils (enumReadPrec)
import Vulkan.Internal.Utils (enumShowsPrec)
import Vulkan.Internal.Utils (traceAroundEvent)
import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Foreign.Marshal.Alloc (allocaBytes)
import GHC.IO (throwIO)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import GHC.Show (showString)
import Numeric (showHex)
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 Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Zero (Zero)
import Vulkan.Zero (Zero(..))
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.Generics (Generic)
import GHC.IO.Exception (IOErrorType(..))
import GHC.IO.Exception (IOException(..))
import Foreign.Ptr (FunPtr)
import Foreign.Ptr (Ptr)
import GHC.Read (Read(readPrec))
import GHC.Show (Show(showsPrec))
import Data.Word (Word32)
import Data.Word (Word64)
import Data.Kind (Type)
import Control.Monad.Trans.Cont (ContT(..))
import Data.Vector (Vector)
import Vulkan.CStruct.Utils (advancePtrBytes)
import Vulkan.Core10.FundamentalTypes (bool32ToBool)
import Vulkan.Core10.FundamentalTypes (boolToBool32)
import Vulkan.NamedType ((:::))
import Vulkan.Core10.FundamentalTypes (Bool32)
import Vulkan.Core10.Handles (CommandBuffer)
import Vulkan.Core10.Handles (CommandBuffer(..))
import Vulkan.Core10.Handles (CommandBuffer(CommandBuffer))
import Vulkan.Core10.Handles (CommandBuffer_T)
import Vulkan.Core10.FundamentalTypes (DeviceAddress)
import Vulkan.Dynamic (DeviceCmds(pVkCmdDecompressMemoryEXT))
import Vulkan.Dynamic (DeviceCmds(pVkCmdDecompressMemoryIndirectCountEXT))
import Vulkan.Core10.FundamentalTypes (DeviceSize)
import Vulkan.Core10.FundamentalTypes (Flags64)
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_DECOMPRESS_MEMORY_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_EXT))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCmdDecompressMemoryEXT
  :: FunPtr (Ptr CommandBuffer_T -> Ptr DecompressMemoryInfoEXT -> IO ()) -> Ptr CommandBuffer_T -> Ptr DecompressMemoryInfoEXT -> IO ()

-- | vkCmdDecompressMemoryEXT - Decompress data between memory regions
--
-- == Valid Usage
--
-- -   #VUID-vkCmdDecompressMemoryEXT-memoryDecompression-11761# The
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-memoryDecompression memoryDecompression>
--     feature /must/ be enabled
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkCmdDecompressMemoryEXT-commandBuffer-parameter#
--     @commandBuffer@ /must/ be a valid
--     'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   #VUID-vkCmdDecompressMemoryEXT-pDecompressMemoryInfoEXT-parameter#
--     @pDecompressMemoryInfoEXT@ /must/ be a valid pointer to a valid
--     'DecompressMemoryInfoEXT' structure
--
-- -   #VUID-vkCmdDecompressMemoryEXT-commandBuffer-recording#
--     @commandBuffer@ /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   #VUID-vkCmdDecompressMemoryEXT-commandBuffer-cmdpool# The
--     'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support
--     'Vulkan.Core10.Enums.QueueFlagBits.QUEUE_COMPUTE_BIT', or
--     'Vulkan.Core10.Enums.QueueFlagBits.QUEUE_GRAPHICS_BIT' operations
--
-- -   #VUID-vkCmdDecompressMemoryEXT-renderpass# This command /must/ only
--     be called outside of a render pass instance
--
-- -   #VUID-vkCmdDecompressMemoryEXT-suspended# This command /must/ not be
--     called between suspended render pass instances
--
-- -   #VUID-vkCmdDecompressMemoryEXT-videocoding# This command /must/ only
--     be called outside of a video coding scope
--
-- == Host Synchronization
--
-- -   Host access to @commandBuffer@ /must/ be externally synchronized
--
-- -   Host access to the 'Vulkan.Core10.Handles.CommandPool' that
--     @commandBuffer@ was allocated from /must/ be externally synchronized
--
-- == Command Properties
--
-- \'
--
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-- | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkCommandBufferLevel Command Buffer Levels> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdBeginRenderPass Render Pass Scope> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdBeginVideoCodingKHR Video Coding Scope> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkQueueFlagBits Supported Queue Types> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-queueoperation-command-types Command Type> |
-- +============================================================================================================================+========================================================================================================================+=============================================================================================================================+=======================================================================================================================+========================================================================================================================================+
-- | Primary                                                                                                                    | Outside                                                                                                                | Outside                                                                                                                     | VK_QUEUE_COMPUTE_BIT                                                                                                  | Action                                                                                                                                 |
-- | Secondary                                                                                                                  |                                                                                                                        |                                                                                                                             | VK_QUEUE_GRAPHICS_BIT                                                                                                 |                                                                                                                                        |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
--
-- == Conditional Rendering
--
-- vkCmdDecompressMemoryEXT is not affected by
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#drawing-conditional-rendering conditional rendering>
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_memory_decompression VK_EXT_memory_decompression>,
-- 'Vulkan.Core10.Handles.CommandBuffer', 'DecompressMemoryInfoEXT'
cmdDecompressMemoryEXT :: forall io
                        . (MonadIO io)
                       => -- | @commandBuffer@ is the command buffer into which the command will be
                          -- recorded.
                          CommandBuffer
                       -> -- | @pDecompressMemoryInfoEXT@ is a pointer to a 'DecompressMemoryInfoEXT'
                          -- structure describing the decompression parameters.
                          DecompressMemoryInfoEXT
                       -> io ()
cmdDecompressMemoryEXT :: forall (io :: * -> *).
MonadIO io =>
CommandBuffer -> DecompressMemoryInfoEXT -> io ()
cmdDecompressMemoryEXT CommandBuffer
commandBuffer
                         DecompressMemoryInfoEXT
decompressMemoryInfoEXT = IO () -> io ()
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ())
-> (ContT () IO () -> IO ()) -> ContT () IO () -> io ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT () IO () -> IO ()
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT () IO () -> io ()) -> ContT () IO () -> io ()
forall a b. (a -> b) -> a -> b
$ do
  let vkCmdDecompressMemoryEXTPtr :: FunPtr
  (Ptr CommandBuffer_T -> Ptr DecompressMemoryInfoEXT -> IO ())
vkCmdDecompressMemoryEXTPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T -> Ptr DecompressMemoryInfoEXT -> IO ())
pVkCmdDecompressMemoryEXT (case CommandBuffer
commandBuffer of CommandBuffer{DeviceCmds
deviceCmds :: DeviceCmds
deviceCmds :: CommandBuffer -> DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  IO () -> ContT () IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT () m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr CommandBuffer_T -> Ptr DecompressMemoryInfoEXT -> IO ())
vkCmdDecompressMemoryEXTPtr FunPtr
  (Ptr CommandBuffer_T -> Ptr DecompressMemoryInfoEXT -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T -> Ptr DecompressMemoryInfoEXT -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T -> Ptr DecompressMemoryInfoEXT -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. (HasCallStack, 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 String
"" String
"The function pointer for vkCmdDecompressMemoryEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdDecompressMemoryEXT' :: Ptr CommandBuffer_T -> Ptr DecompressMemoryInfoEXT -> IO ()
vkCmdDecompressMemoryEXT' = FunPtr
  (Ptr CommandBuffer_T -> Ptr DecompressMemoryInfoEXT -> IO ())
-> Ptr CommandBuffer_T -> Ptr DecompressMemoryInfoEXT -> IO ()
mkVkCmdDecompressMemoryEXT FunPtr
  (Ptr CommandBuffer_T -> Ptr DecompressMemoryInfoEXT -> IO ())
vkCmdDecompressMemoryEXTPtr
  pDecompressMemoryInfoEXT <- ((Ptr DecompressMemoryInfoEXT -> IO ()) -> IO ())
-> ContT () IO (Ptr DecompressMemoryInfoEXT)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr DecompressMemoryInfoEXT -> IO ()) -> IO ())
 -> ContT () IO (Ptr DecompressMemoryInfoEXT))
-> ((Ptr DecompressMemoryInfoEXT -> IO ()) -> IO ())
-> ContT () IO (Ptr DecompressMemoryInfoEXT)
forall a b. (a -> b) -> a -> b
$ DecompressMemoryInfoEXT
-> (Ptr DecompressMemoryInfoEXT -> IO ()) -> IO ()
forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b
forall b.
DecompressMemoryInfoEXT
-> (Ptr DecompressMemoryInfoEXT -> IO b) -> IO b
withCStruct (DecompressMemoryInfoEXT
decompressMemoryInfoEXT)
  lift $ traceAroundEvent "vkCmdDecompressMemoryEXT" (vkCmdDecompressMemoryEXT'
                                                        (commandBufferHandle (commandBuffer))
                                                        pDecompressMemoryInfoEXT)
  pure $ ()


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCmdDecompressMemoryIndirectCountEXT
  :: FunPtr (Ptr CommandBuffer_T -> MemoryDecompressionMethodFlagsEXT -> DeviceAddress -> DeviceAddress -> Word32 -> Word32 -> IO ()) -> Ptr CommandBuffer_T -> MemoryDecompressionMethodFlagsEXT -> DeviceAddress -> DeviceAddress -> Word32 -> Word32 -> IO ()

-- | vkCmdDecompressMemoryIndirectCountEXT - Indirect decompress data between
-- memory regions
--
-- = Description
--
-- Each region specified in @indirectCommandsAddress@ is decompressed from
-- the source to destination region based on the specified
-- @decompressionMethod@.
--
-- == Valid Usage
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-None-07692# The
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-memoryDecompression memoryDecompression>
--     feature /must/ be enabled
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-indirectCommandsAddress-07694#
--     @indirectCommandsAddress@ /must/ be a device address allocated to
--     the application from a buffer created with the
--     'Vulkan.Core10.Enums.BufferUsageFlagBits.BUFFER_USAGE_INDIRECT_BUFFER_BIT'
--     usage flag set
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-indirectCommandsAddress-07695#
--     @indirectCommandsAddress@ /must/ be a multiple of @4@
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-indirectCommandsCountAddress-07697#
--     @indirectCommandsCountAddress@ /must/ be a device address allocated
--     to the application from a buffer created with the
--     'Vulkan.Core10.Enums.BufferUsageFlagBits.BUFFER_USAGE_INDIRECT_BUFFER_BIT'
--     usage flag set
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-indirectCommandsCountAddress-07698#
--     @indirectCommandsCountAddress@ /must/ be a multiple of @4@
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-indirectCommandsCountAddress-07699#
--     The count stored in @indirectCommandsCountAddress@ /must/ be less
--     than or equal to
--     'PhysicalDeviceMemoryDecompressionPropertiesEXT'::@maxDecompressionIndirectCount@
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-indirectCommandsAddress-11794#
--     All device addresses between @indirectCommandsAddress@ and
--     @indirectCommandsAddress@ + (@stride@ × (count stored in
--     @indirectCommandsCountAddress@)) - 1 /must/ be in the buffer device
--     address range of the same buffer
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-decompressionMethod-07690#
--     The @decompressionMethod@ /must/ have a single bit set
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-stride-11767# @stride@
--     /must/ be a multiple of @4@ and /must/ be greater than or equal to
--     sizeof('DecompressMemoryRegionEXT')
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-maxDecompressionCount-11768#
--     @maxDecompressionCount@ /must/ be less than or equal to
--     'PhysicalDeviceMemoryDecompressionPropertiesEXT'::@maxDecompressionIndirectCount@
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-decompressionMethod-11769#
--     If @decompressionMethod@ is
--     'MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT', then all values
--     in 'DecompressMemoryRegionEXT'::@decompressedSize@ /must/ be less
--     than or equal to 65536 bytes
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-decompressionMethod-11810#
--     @decompressionMethod@ /must/ be a valid bit specified in
--     'PhysicalDeviceMemoryDecompressionPropertiesEXT'::@decompressionMethods@
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-commandBuffer-parameter#
--     @commandBuffer@ /must/ be a valid
--     'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-decompressionMethod-parameter#
--     @decompressionMethod@ /must/ be a valid combination of
--     'MemoryDecompressionMethodFlagBitsEXT' values
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-decompressionMethod-requiredbitmask#
--     @decompressionMethod@ /must/ not be @0@
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-indirectCommandsAddress-parameter#
--     @indirectCommandsAddress@ /must/ be a valid
--     'Vulkan.Core10.FundamentalTypes.DeviceAddress' value
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-indirectCommandsCountAddress-parameter#
--     @indirectCommandsCountAddress@ /must/ be a valid
--     'Vulkan.Core10.FundamentalTypes.DeviceAddress' value
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-commandBuffer-recording#
--     @commandBuffer@ /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-commandBuffer-cmdpool#
--     The 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support
--     'Vulkan.Core10.Enums.QueueFlagBits.QUEUE_COMPUTE_BIT', or
--     'Vulkan.Core10.Enums.QueueFlagBits.QUEUE_GRAPHICS_BIT' operations
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-renderpass# This command
--     /must/ only be called outside of a render pass instance
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-suspended# This command
--     /must/ not be called between suspended render pass instances
--
-- -   #VUID-vkCmdDecompressMemoryIndirectCountEXT-videocoding# This
--     command /must/ only be called outside of a video coding scope
--
-- == Host Synchronization
--
-- -   Host access to @commandBuffer@ /must/ be externally synchronized
--
-- -   Host access to the 'Vulkan.Core10.Handles.CommandPool' that
--     @commandBuffer@ was allocated from /must/ be externally synchronized
--
-- == Command Properties
--
-- \'
--
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-- | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkCommandBufferLevel Command Buffer Levels> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdBeginRenderPass Render Pass Scope> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdBeginVideoCodingKHR Video Coding Scope> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkQueueFlagBits Supported Queue Types> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-queueoperation-command-types Command Type> |
-- +============================================================================================================================+========================================================================================================================+=============================================================================================================================+=======================================================================================================================+========================================================================================================================================+
-- | Primary                                                                                                                    | Outside                                                                                                                | Outside                                                                                                                     | VK_QUEUE_COMPUTE_BIT                                                                                                  | Action                                                                                                                                 |
-- | Secondary                                                                                                                  |                                                                                                                        |                                                                                                                             | VK_QUEUE_GRAPHICS_BIT                                                                                                 |                                                                                                                                        |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
--
-- == Conditional Rendering
--
-- vkCmdDecompressMemoryIndirectCountEXT is not affected by
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#drawing-conditional-rendering conditional rendering>
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_memory_decompression VK_EXT_memory_decompression>,
-- 'Vulkan.Core10.Handles.CommandBuffer',
-- 'Vulkan.Core10.FundamentalTypes.DeviceAddress',
-- 'MemoryDecompressionMethodFlagsEXT'
cmdDecompressMemoryIndirectCountEXT :: forall io
                                     . (MonadIO io)
                                    => -- | @commandBuffer@ is the command buffer into which the command will be
                                       -- recorded.
                                       CommandBuffer
                                    -> -- | @decompressionMethod@ is a bitmask of
                                       -- 'MemoryDecompressionMethodFlagBitsEXT' with a single bit set specifying
                                       -- the method used to decompress data.
                                       MemoryDecompressionMethodFlagsEXT
                                    -> -- | @indirectCommandsAddress@ is the device address containing decompression
                                       -- parameters laid out as an array of 'DecompressMemoryRegionEXT'
                                       -- structures.
                                       ("indirectCommandsAddress" ::: DeviceAddress)
                                    -> -- | @indirectCommandsCountAddress@ is the device address containing a 32-bit
                                       -- integer value specifying the decompression count.
                                       ("indirectCommandsCountAddress" ::: DeviceAddress)
                                    -> -- | @maxDecompressionCount@ is maximum number of decompressions that will be
                                       -- executed. The actual number of executed decompressions is the minimum of
                                       -- the count specified in @indirectCommandsCountAddress@ and
                                       -- @maxDecompressionCount@.
                                       ("maxDecompressionCount" ::: Word32)
                                    -> -- | @stride@ is the byte stride between successive sets of decompression
                                       -- parameters located starting from @indirectCommandsAddress@.
                                       ("stride" ::: Word32)
                                    -> io ()
cmdDecompressMemoryIndirectCountEXT :: forall (io :: * -> *).
MonadIO io =>
CommandBuffer
-> MemoryDecompressionMethodFlagsEXT
-> Word64
-> Word64
-> ("maxDecompressionCount" ::: Word32)
-> ("maxDecompressionCount" ::: Word32)
-> io ()
cmdDecompressMemoryIndirectCountEXT CommandBuffer
commandBuffer
                                      MemoryDecompressionMethodFlagsEXT
decompressionMethod
                                      Word64
indirectCommandsAddress
                                      Word64
indirectCommandsCountAddress
                                      "maxDecompressionCount" ::: Word32
maxDecompressionCount
                                      "maxDecompressionCount" ::: Word32
stride = IO () -> io ()
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ()) -> IO () -> io ()
forall a b. (a -> b) -> a -> b
$ do
  let vkCmdDecompressMemoryIndirectCountEXTPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> MemoryDecompressionMethodFlagsEXT
   -> Word64
   -> Word64
   -> ("maxDecompressionCount" ::: Word32)
   -> ("maxDecompressionCount" ::: Word32)
   -> IO ())
vkCmdDecompressMemoryIndirectCountEXTPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> MemoryDecompressionMethodFlagsEXT
      -> Word64
      -> Word64
      -> ("maxDecompressionCount" ::: Word32)
      -> ("maxDecompressionCount" ::: Word32)
      -> IO ())
pVkCmdDecompressMemoryIndirectCountEXT (case CommandBuffer
commandBuffer of CommandBuffer{DeviceCmds
deviceCmds :: CommandBuffer -> DeviceCmds
deviceCmds :: DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr CommandBuffer_T
   -> MemoryDecompressionMethodFlagsEXT
   -> Word64
   -> Word64
   -> ("maxDecompressionCount" ::: Word32)
   -> ("maxDecompressionCount" ::: Word32)
   -> IO ())
vkCmdDecompressMemoryIndirectCountEXTPtr FunPtr
  (Ptr CommandBuffer_T
   -> MemoryDecompressionMethodFlagsEXT
   -> Word64
   -> Word64
   -> ("maxDecompressionCount" ::: Word32)
   -> ("maxDecompressionCount" ::: Word32)
   -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> MemoryDecompressionMethodFlagsEXT
      -> Word64
      -> Word64
      -> ("maxDecompressionCount" ::: Word32)
      -> ("maxDecompressionCount" ::: Word32)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> MemoryDecompressionMethodFlagsEXT
   -> Word64
   -> Word64
   -> ("maxDecompressionCount" ::: Word32)
   -> ("maxDecompressionCount" ::: Word32)
   -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. (HasCallStack, 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 String
"" String
"The function pointer for vkCmdDecompressMemoryIndirectCountEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdDecompressMemoryIndirectCountEXT' :: Ptr CommandBuffer_T
-> MemoryDecompressionMethodFlagsEXT
-> Word64
-> Word64
-> ("maxDecompressionCount" ::: Word32)
-> ("maxDecompressionCount" ::: Word32)
-> IO ()
vkCmdDecompressMemoryIndirectCountEXT' = FunPtr
  (Ptr CommandBuffer_T
   -> MemoryDecompressionMethodFlagsEXT
   -> Word64
   -> Word64
   -> ("maxDecompressionCount" ::: Word32)
   -> ("maxDecompressionCount" ::: Word32)
   -> IO ())
-> Ptr CommandBuffer_T
-> MemoryDecompressionMethodFlagsEXT
-> Word64
-> Word64
-> ("maxDecompressionCount" ::: Word32)
-> ("maxDecompressionCount" ::: Word32)
-> IO ()
mkVkCmdDecompressMemoryIndirectCountEXT FunPtr
  (Ptr CommandBuffer_T
   -> MemoryDecompressionMethodFlagsEXT
   -> Word64
   -> Word64
   -> ("maxDecompressionCount" ::: Word32)
   -> ("maxDecompressionCount" ::: Word32)
   -> IO ())
vkCmdDecompressMemoryIndirectCountEXTPtr
  String -> IO () -> IO ()
forall a. String -> IO a -> IO a
traceAroundEvent String
"vkCmdDecompressMemoryIndirectCountEXT" (Ptr CommandBuffer_T
-> MemoryDecompressionMethodFlagsEXT
-> Word64
-> Word64
-> ("maxDecompressionCount" ::: Word32)
-> ("maxDecompressionCount" ::: Word32)
-> IO ()
vkCmdDecompressMemoryIndirectCountEXT'
                                                              (CommandBuffer -> Ptr CommandBuffer_T
commandBufferHandle (CommandBuffer
commandBuffer))
                                                              (MemoryDecompressionMethodFlagsEXT
decompressionMethod)
                                                              (Word64
indirectCommandsAddress)
                                                              (Word64
indirectCommandsCountAddress)
                                                              ("maxDecompressionCount" ::: Word32
maxDecompressionCount)
                                                              ("maxDecompressionCount" ::: Word32
stride))
  () -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> IO ()) -> () -> IO ()
forall a b. (a -> b) -> a -> b
$ ()


-- No documentation found for TopLevel "VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV"
pattern $mMEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV :: forall {r}.
MemoryDecompressionMethodFlagsEXT
-> ((# #) -> r) -> ((# #) -> r) -> r
$bMEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV :: MemoryDecompressionMethodFlagsEXT
MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV = MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT


-- | VkPhysicalDeviceMemoryDecompressionFeaturesEXT - Structure describing if
-- memory decompression is supported by an implementation
--
-- = Members
--
-- This structure describes the following features:
--
-- = Description
--
-- If the 'PhysicalDeviceMemoryDecompressionFeaturesEXT' structure is
-- included in the @pNext@ chain of the
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2'
-- structure passed to
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceFeatures2',
-- it is filled in to indicate whether each corresponding feature is
-- supported. If the application wishes to use a
-- 'Vulkan.Core10.Handles.Device' with any features described by
-- 'PhysicalDeviceMemoryDecompressionFeaturesEXT', it /must/ add an
-- instance of the structure, with the desired feature members set to
-- 'Vulkan.Core10.FundamentalTypes.TRUE', to the @pNext@ chain of
-- 'Vulkan.Core10.Device.DeviceCreateInfo' when creating the
-- 'Vulkan.Core10.Handles.Device'.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_memory_decompression VK_EXT_memory_decompression>,
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_NV_memory_decompression VK_NV_memory_decompression>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceMemoryDecompressionFeaturesEXT = PhysicalDeviceMemoryDecompressionFeaturesEXT
  { -- | #features-memoryDecompression# @memoryDecompression@ indicates whether
    -- memory decompression is supported.
    PhysicalDeviceMemoryDecompressionFeaturesEXT -> Bool
memoryDecompression :: Bool }
  deriving (Typeable, PhysicalDeviceMemoryDecompressionFeaturesEXT
-> PhysicalDeviceMemoryDecompressionFeaturesEXT -> Bool
(PhysicalDeviceMemoryDecompressionFeaturesEXT
 -> PhysicalDeviceMemoryDecompressionFeaturesEXT -> Bool)
-> (PhysicalDeviceMemoryDecompressionFeaturesEXT
    -> PhysicalDeviceMemoryDecompressionFeaturesEXT -> Bool)
-> Eq PhysicalDeviceMemoryDecompressionFeaturesEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PhysicalDeviceMemoryDecompressionFeaturesEXT
-> PhysicalDeviceMemoryDecompressionFeaturesEXT -> Bool
== :: PhysicalDeviceMemoryDecompressionFeaturesEXT
-> PhysicalDeviceMemoryDecompressionFeaturesEXT -> Bool
$c/= :: PhysicalDeviceMemoryDecompressionFeaturesEXT
-> PhysicalDeviceMemoryDecompressionFeaturesEXT -> Bool
/= :: PhysicalDeviceMemoryDecompressionFeaturesEXT
-> PhysicalDeviceMemoryDecompressionFeaturesEXT -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceMemoryDecompressionFeaturesEXT)
#endif
deriving instance Show PhysicalDeviceMemoryDecompressionFeaturesEXT

instance ToCStruct PhysicalDeviceMemoryDecompressionFeaturesEXT where
  withCStruct :: forall b.
PhysicalDeviceMemoryDecompressionFeaturesEXT
-> (Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT -> IO b)
-> IO b
withCStruct PhysicalDeviceMemoryDecompressionFeaturesEXT
x Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT -> IO b
f = Int
-> (Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT -> IO b)
-> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
24 ((Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT -> IO b)
 -> IO b)
-> (Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT -> IO b)
-> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p -> Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
-> PhysicalDeviceMemoryDecompressionFeaturesEXT -> IO b -> IO b
forall b.
Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
-> PhysicalDeviceMemoryDecompressionFeaturesEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p PhysicalDeviceMemoryDecompressionFeaturesEXT
x (Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT -> IO b
f Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p)
  pokeCStruct :: forall b.
Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
-> PhysicalDeviceMemoryDecompressionFeaturesEXT -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p PhysicalDeviceMemoryDecompressionFeaturesEXT{Bool
memoryDecompression :: PhysicalDeviceMemoryDecompressionFeaturesEXT -> Bool
memoryDecompression :: Bool
..} IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
-> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
memoryDecompression))
    IO b
f
  cStructSize :: Int
cStructSize = Int
24
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b.
Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT -> IO b -> IO b
pokeZeroCStruct Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
-> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
forall a. Zero a => a
zero))
    IO b
f

instance FromCStruct PhysicalDeviceMemoryDecompressionFeaturesEXT where
  peekCStruct :: Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
-> IO PhysicalDeviceMemoryDecompressionFeaturesEXT
peekCStruct Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p = do
    memoryDecompression <- forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
p Ptr PhysicalDeviceMemoryDecompressionFeaturesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32))
    pure $ PhysicalDeviceMemoryDecompressionFeaturesEXT
             (bool32ToBool memoryDecompression)

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

instance Zero PhysicalDeviceMemoryDecompressionFeaturesEXT where
  zero :: PhysicalDeviceMemoryDecompressionFeaturesEXT
zero = Bool -> PhysicalDeviceMemoryDecompressionFeaturesEXT
PhysicalDeviceMemoryDecompressionFeaturesEXT
           Bool
forall a. Zero a => a
zero


-- | VkPhysicalDeviceMemoryDecompressionPropertiesEXT - Structure describing
-- supported memory decompression methods by an implementation
--
-- = Description
--
-- If
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-memoryDecompression memoryDecompression>
-- feature is supported, @decompressionMethods@ /must/ have at least one
-- bit set.
--
-- If the 'PhysicalDeviceMemoryDecompressionPropertiesEXT' structure is
-- included in the @pNext@ chain of the
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2'
-- structure passed to
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceProperties2',
-- it is filled in with each corresponding implementation-dependent
-- property.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_memory_decompression VK_EXT_memory_decompression>,
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_NV_memory_decompression VK_NV_memory_decompression>,
-- 'MemoryDecompressionMethodFlagsEXT',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceMemoryDecompressionPropertiesEXT = PhysicalDeviceMemoryDecompressionPropertiesEXT
  { -- | @decompressionMethods@ is a bitmask of
    -- 'MemoryDecompressionMethodFlagBitsEXT' specifying memory decompression
    -- methods supported by the implementation.
    PhysicalDeviceMemoryDecompressionPropertiesEXT
-> MemoryDecompressionMethodFlagsEXT
decompressionMethods :: MemoryDecompressionMethodFlagsEXT
  , -- | @maxDecompressionIndirectCount@ specifies the maximum supported count
    -- value identified by either
    -- 'cmdDecompressMemoryIndirectCountEXT'::@maxDecompressionCount@ or the
    -- value specified in
    -- 'cmdDecompressMemoryIndirectCountEXT'::@indirectCommandsCountAddress@
    PhysicalDeviceMemoryDecompressionPropertiesEXT -> Word64
maxDecompressionIndirectCount :: Word64
  }
  deriving (Typeable, PhysicalDeviceMemoryDecompressionPropertiesEXT
-> PhysicalDeviceMemoryDecompressionPropertiesEXT -> Bool
(PhysicalDeviceMemoryDecompressionPropertiesEXT
 -> PhysicalDeviceMemoryDecompressionPropertiesEXT -> Bool)
-> (PhysicalDeviceMemoryDecompressionPropertiesEXT
    -> PhysicalDeviceMemoryDecompressionPropertiesEXT -> Bool)
-> Eq PhysicalDeviceMemoryDecompressionPropertiesEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PhysicalDeviceMemoryDecompressionPropertiesEXT
-> PhysicalDeviceMemoryDecompressionPropertiesEXT -> Bool
== :: PhysicalDeviceMemoryDecompressionPropertiesEXT
-> PhysicalDeviceMemoryDecompressionPropertiesEXT -> Bool
$c/= :: PhysicalDeviceMemoryDecompressionPropertiesEXT
-> PhysicalDeviceMemoryDecompressionPropertiesEXT -> Bool
/= :: PhysicalDeviceMemoryDecompressionPropertiesEXT
-> PhysicalDeviceMemoryDecompressionPropertiesEXT -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceMemoryDecompressionPropertiesEXT)
#endif
deriving instance Show PhysicalDeviceMemoryDecompressionPropertiesEXT

instance ToCStruct PhysicalDeviceMemoryDecompressionPropertiesEXT where
  withCStruct :: forall b.
PhysicalDeviceMemoryDecompressionPropertiesEXT
-> (Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT -> IO b)
-> IO b
withCStruct PhysicalDeviceMemoryDecompressionPropertiesEXT
x Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT -> IO b
f = Int
-> (Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT -> IO b)
-> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
32 ((Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT -> IO b)
 -> IO b)
-> (Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT -> IO b)
-> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p -> Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> PhysicalDeviceMemoryDecompressionPropertiesEXT -> IO b -> IO b
forall b.
Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> PhysicalDeviceMemoryDecompressionPropertiesEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p PhysicalDeviceMemoryDecompressionPropertiesEXT
x (Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT -> IO b
f Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p)
  pokeCStruct :: forall b.
Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> PhysicalDeviceMemoryDecompressionPropertiesEXT -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p PhysicalDeviceMemoryDecompressionPropertiesEXT{Word64
MemoryDecompressionMethodFlagsEXT
decompressionMethods :: PhysicalDeviceMemoryDecompressionPropertiesEXT
-> MemoryDecompressionMethodFlagsEXT
maxDecompressionIndirectCount :: PhysicalDeviceMemoryDecompressionPropertiesEXT -> Word64
decompressionMethods :: MemoryDecompressionMethodFlagsEXT
maxDecompressionIndirectCount :: Word64
..} IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> Int -> Ptr MemoryDecompressionMethodFlagsEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr MemoryDecompressionMethodFlagsEXT)) (MemoryDecompressionMethodFlagsEXT
decompressionMethods)
    Ptr Word64 -> Word64 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> Int -> Ptr Word64
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr Word64)) (Word64
maxDecompressionIndirectCount)
    IO b
f
  cStructSize :: Int
cStructSize = Int
32
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b.
Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT -> IO b -> IO b
pokeZeroCStruct Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> Int -> Ptr MemoryDecompressionMethodFlagsEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr MemoryDecompressionMethodFlagsEXT)) (MemoryDecompressionMethodFlagsEXT
forall a. Zero a => a
zero)
    Ptr Word64 -> Word64 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> Int -> Ptr Word64
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr Word64)) (Word64
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct PhysicalDeviceMemoryDecompressionPropertiesEXT where
  peekCStruct :: Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> IO PhysicalDeviceMemoryDecompressionPropertiesEXT
peekCStruct Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p = do
    decompressionMethods <- forall a. Storable a => Ptr a -> IO a
peek @MemoryDecompressionMethodFlagsEXT ((Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
p Ptr PhysicalDeviceMemoryDecompressionPropertiesEXT
-> Int -> Ptr MemoryDecompressionMethodFlagsEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr MemoryDecompressionMethodFlagsEXT))
    maxDecompressionIndirectCount <- peek @Word64 ((p `plusPtr` 24 :: Ptr Word64))
    pure $ PhysicalDeviceMemoryDecompressionPropertiesEXT
             decompressionMethods maxDecompressionIndirectCount

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

instance Zero PhysicalDeviceMemoryDecompressionPropertiesEXT where
  zero :: PhysicalDeviceMemoryDecompressionPropertiesEXT
zero = MemoryDecompressionMethodFlagsEXT
-> Word64 -> PhysicalDeviceMemoryDecompressionPropertiesEXT
PhysicalDeviceMemoryDecompressionPropertiesEXT
           MemoryDecompressionMethodFlagsEXT
forall a. Zero a => a
zero
           Word64
forall a. Zero a => a
zero


-- | VkDecompressMemoryRegionEXT - Structure specifying decompression region
--
-- = Description
--
-- Accesses to compressed and decompressed data specified in @srcAddress@
-- and @dstAddress@ /must/ be
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#synchronization-dependencies synchronized>
-- with the
-- 'Vulkan.Core13.Enums.PipelineStageFlags2.PIPELINE_STAGE_2_MEMORY_DECOMPRESSION_BIT_EXT'
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#synchronization-pipeline-stages pipeline stage>
-- with
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#synchronization-access-types access type>
-- of
-- 'Vulkan.Core13.Enums.AccessFlags2.ACCESS_2_MEMORY_DECOMPRESSION_READ_BIT_EXT'
-- or
-- 'Vulkan.Core13.Enums.AccessFlags2.ACCESS_2_MEMORY_DECOMPRESSION_WRITE_BIT_EXT'.
--
-- == Valid Usage
--
-- -   #VUID-VkDecompressMemoryRegionEXT-srcAddress-07685# @srcAddress@
--     /must/ be 4 byte aligned
--
-- -   #VUID-VkDecompressMemoryRegionEXT-srcAddress-07686# The memory range
--     defined by @srcAddress@ and @compressedSize@ /must/ be contained
--     within the size of the buffer bound to @srcAddress@, minus the
--     offset of @srcAddress@ from the base address of that buffer
--
-- -   #VUID-VkDecompressMemoryRegionEXT-dstAddress-07687# @dstAddress@
--     /must/ be 4 byte aligned
--
-- -   #VUID-VkDecompressMemoryRegionEXT-dstAddress-07688# The memory range
--     defined by @dstAddress@ and @decompressedSize@ /must/ be contained
--     within the size of the buffer bound to @dstAddress@, minus the
--     offset of @dstAddress@ from the base address of that buffer
--
-- -   #VUID-VkDecompressMemoryRegionEXT-decompressedSize-07689#
--     @decompressedSize@ /must/ be large enough to hold the decompressed
--     data based on the @decompressionMethod@
--
-- -   #VUID-VkDecompressMemoryRegionEXT-compressedSize-11795#
--     @compressedSize@ /must/ not be zero
--
-- -   #VUID-VkDecompressMemoryRegionEXT-decompressedSize-11796#
--     @decompressedSize@ /must/ not be zero
--
-- -   #VUID-VkDecompressMemoryRegionEXT-srcAddress-07691# The memory range
--     defined by @srcAddress@ and @compressedSize@ /must/ not overlap the
--     memory range defined by @dstAddress@ and @decompressedSize@
--
-- -   #VUID-VkDecompressMemoryRegionEXT-srcAddress-11764# @srcAddress@
--     /must/ be a device address allocated to the application from a
--     buffer created with the
--     'Vulkan.Core14.Enums.BufferUsageFlags2.BUFFER_USAGE_2_MEMORY_DECOMPRESSION_BIT_EXT'
--     usage flag set
--
-- -   #VUID-VkDecompressMemoryRegionEXT-dstAddress-11765# @dstAddress@
--     /must/ be a device address allocated to the application from a
--     buffer created with the
--     'Vulkan.Core14.Enums.BufferUsageFlags2.BUFFER_USAGE_2_MEMORY_DECOMPRESSION_BIT_EXT'
--     usage flag set
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkDecompressMemoryRegionEXT-srcAddress-parameter# @srcAddress@
--     /must/ be a valid 'Vulkan.Core10.FundamentalTypes.DeviceAddress'
--     value
--
-- -   #VUID-VkDecompressMemoryRegionEXT-dstAddress-parameter# @dstAddress@
--     /must/ be a valid 'Vulkan.Core10.FundamentalTypes.DeviceAddress'
--     value
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_memory_decompression VK_EXT_memory_decompression>,
-- 'DecompressMemoryInfoEXT',
-- 'Vulkan.Core10.FundamentalTypes.DeviceAddress',
-- 'Vulkan.Core10.FundamentalTypes.DeviceSize'
data DecompressMemoryRegionEXT = DecompressMemoryRegionEXT
  { -- | @srcAddress@ is the address where compressed data is stored.
    DecompressMemoryRegionEXT -> Word64
srcAddress :: DeviceAddress
  , -- | @dstAddress@ is the destination address where decompressed data will be
    -- written.
    DecompressMemoryRegionEXT -> Word64
dstAddress :: DeviceAddress
  , -- | @compressedSize@ is the size of compressed data in bytes.
    DecompressMemoryRegionEXT -> Word64
compressedSize :: DeviceSize
  , -- | @decompressedSize@ is the size of decompressed data in bytes.
    DecompressMemoryRegionEXT -> Word64
decompressedSize :: DeviceSize
  }
  deriving (Typeable, DecompressMemoryRegionEXT -> DecompressMemoryRegionEXT -> Bool
(DecompressMemoryRegionEXT -> DecompressMemoryRegionEXT -> Bool)
-> (DecompressMemoryRegionEXT -> DecompressMemoryRegionEXT -> Bool)
-> Eq DecompressMemoryRegionEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DecompressMemoryRegionEXT -> DecompressMemoryRegionEXT -> Bool
== :: DecompressMemoryRegionEXT -> DecompressMemoryRegionEXT -> Bool
$c/= :: DecompressMemoryRegionEXT -> DecompressMemoryRegionEXT -> Bool
/= :: DecompressMemoryRegionEXT -> DecompressMemoryRegionEXT -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (DecompressMemoryRegionEXT)
#endif
deriving instance Show DecompressMemoryRegionEXT

instance ToCStruct DecompressMemoryRegionEXT where
  withCStruct :: forall b.
DecompressMemoryRegionEXT
-> (Ptr DecompressMemoryRegionEXT -> IO b) -> IO b
withCStruct DecompressMemoryRegionEXT
x Ptr DecompressMemoryRegionEXT -> IO b
f = Int -> (Ptr DecompressMemoryRegionEXT -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
32 ((Ptr DecompressMemoryRegionEXT -> IO b) -> IO b)
-> (Ptr DecompressMemoryRegionEXT -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr DecompressMemoryRegionEXT
p -> Ptr DecompressMemoryRegionEXT
-> DecompressMemoryRegionEXT -> IO b -> IO b
forall b.
Ptr DecompressMemoryRegionEXT
-> DecompressMemoryRegionEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr DecompressMemoryRegionEXT
p DecompressMemoryRegionEXT
x (Ptr DecompressMemoryRegionEXT -> IO b
f Ptr DecompressMemoryRegionEXT
p)
  pokeCStruct :: forall b.
Ptr DecompressMemoryRegionEXT
-> DecompressMemoryRegionEXT -> IO b -> IO b
pokeCStruct Ptr DecompressMemoryRegionEXT
p DecompressMemoryRegionEXT{Word64
srcAddress :: DecompressMemoryRegionEXT -> Word64
dstAddress :: DecompressMemoryRegionEXT -> Word64
compressedSize :: DecompressMemoryRegionEXT -> Word64
decompressedSize :: DecompressMemoryRegionEXT -> Word64
srcAddress :: Word64
dstAddress :: Word64
compressedSize :: Word64
decompressedSize :: Word64
..} IO b
f = do
    Ptr Word64 -> Word64 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryRegionEXT
p Ptr DecompressMemoryRegionEXT -> Int -> Ptr Word64
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr DeviceAddress)) (Word64
srcAddress)
    Ptr Word64 -> Word64 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryRegionEXT
p Ptr DecompressMemoryRegionEXT -> Int -> Ptr Word64
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr DeviceAddress)) (Word64
dstAddress)
    Ptr Word64 -> Word64 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryRegionEXT
p Ptr DecompressMemoryRegionEXT -> Int -> Ptr Word64
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr DeviceSize)) (Word64
compressedSize)
    Ptr Word64 -> Word64 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryRegionEXT
p Ptr DecompressMemoryRegionEXT -> Int -> Ptr Word64
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr DeviceSize)) (Word64
decompressedSize)
    IO b
f
  cStructSize :: Int
cStructSize = Int
32
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b. Ptr DecompressMemoryRegionEXT -> IO b -> IO b
pokeZeroCStruct Ptr DecompressMemoryRegionEXT
p IO b
f = do
    Ptr Word64 -> Word64 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryRegionEXT
p Ptr DecompressMemoryRegionEXT -> Int -> Ptr Word64
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr DeviceAddress)) (Word64
forall a. Zero a => a
zero)
    Ptr Word64 -> Word64 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryRegionEXT
p Ptr DecompressMemoryRegionEXT -> Int -> Ptr Word64
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr DeviceAddress)) (Word64
forall a. Zero a => a
zero)
    Ptr Word64 -> Word64 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryRegionEXT
p Ptr DecompressMemoryRegionEXT -> Int -> Ptr Word64
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr DeviceSize)) (Word64
forall a. Zero a => a
zero)
    Ptr Word64 -> Word64 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryRegionEXT
p Ptr DecompressMemoryRegionEXT -> Int -> Ptr Word64
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr DeviceSize)) (Word64
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct DecompressMemoryRegionEXT where
  peekCStruct :: Ptr DecompressMemoryRegionEXT -> IO DecompressMemoryRegionEXT
peekCStruct Ptr DecompressMemoryRegionEXT
p = do
    srcAddress <- forall a. Storable a => Ptr a -> IO a
peek @DeviceAddress ((Ptr DecompressMemoryRegionEXT
p Ptr DecompressMemoryRegionEXT -> Int -> Ptr Word64
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr DeviceAddress))
    dstAddress <- peek @DeviceAddress ((p `plusPtr` 8 :: Ptr DeviceAddress))
    compressedSize <- peek @DeviceSize ((p `plusPtr` 16 :: Ptr DeviceSize))
    decompressedSize <- peek @DeviceSize ((p `plusPtr` 24 :: Ptr DeviceSize))
    pure $ DecompressMemoryRegionEXT
             srcAddress dstAddress compressedSize decompressedSize

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

instance Zero DecompressMemoryRegionEXT where
  zero :: DecompressMemoryRegionEXT
zero = Word64 -> Word64 -> Word64 -> Word64 -> DecompressMemoryRegionEXT
DecompressMemoryRegionEXT
           Word64
forall a. Zero a => a
zero
           Word64
forall a. Zero a => a
zero
           Word64
forall a. Zero a => a
zero
           Word64
forall a. Zero a => a
zero


-- | VkDecompressMemoryInfoEXT - Structure specifying decompression memory
-- info
--
-- = Description
--
-- Each memory region specified in @pRegions@ is decompressed from the
-- source to the destination address based on the decompression method
-- specified in @decompressionMethod@. If any of the specified source and
-- destination regions overlap in memory, then the results of decompression
-- are undefined.
--
-- == Valid Usage
--
-- -   #VUID-VkDecompressMemoryInfoEXT-decompressionMethod-07690# The
--     @decompressionMethod@ /must/ have a single bit set
--
-- -   #VUID-VkDecompressMemoryInfoEXT-decompressionMethod-11762# If
--     @decompressionMethod@ is
--     'MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT', then for each
--     element of @pRegions@, @decompressedSize@ /must/ be less than or
--     equal to 65536 bytes
--
-- -   #VUID-VkDecompressMemoryInfoEXT-decompressionMethod-11763#
--     @decompressionMethod@ /must/ be a valid bit specified in
--     'PhysicalDeviceMemoryDecompressionPropertiesEXT'::@decompressionMethods@
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkDecompressMemoryInfoEXT-sType-sType# @sType@ /must/ be
--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_DECOMPRESS_MEMORY_INFO_EXT'
--
-- -   #VUID-VkDecompressMemoryInfoEXT-pNext-pNext# @pNext@ /must/ be
--     @NULL@
--
-- -   #VUID-VkDecompressMemoryInfoEXT-decompressionMethod-parameter#
--     @decompressionMethod@ /must/ be a valid combination of
--     'MemoryDecompressionMethodFlagBitsEXT' values
--
-- -   #VUID-VkDecompressMemoryInfoEXT-decompressionMethod-requiredbitmask#
--     @decompressionMethod@ /must/ not be @0@
--
-- -   #VUID-VkDecompressMemoryInfoEXT-pRegions-parameter# @pRegions@
--     /must/ be a valid pointer to an array of @regionCount@
--     'DecompressMemoryRegionEXT' structures
--
-- -   #VUID-VkDecompressMemoryInfoEXT-regionCount-arraylength#
--     @regionCount@ /must/ be greater than @0@
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_memory_decompression VK_EXT_memory_decompression>,
-- 'DecompressMemoryRegionEXT', 'MemoryDecompressionMethodFlagsEXT',
-- 'Vulkan.Core10.Enums.StructureType.StructureType',
-- 'cmdDecompressMemoryEXT'
data DecompressMemoryInfoEXT = DecompressMemoryInfoEXT
  { -- | @decompressionMethod@ is a bitmask of
    -- 'MemoryDecompressionMethodFlagBitsEXT' with a single bit set specifying
    -- the method used to decompress data.
    DecompressMemoryInfoEXT -> MemoryDecompressionMethodFlagsEXT
decompressionMethod :: MemoryDecompressionMethodFlagsEXT
  , -- | @pRegions@ is a pointer to an array of 'DecompressMemoryRegionEXT'
    -- structures specifying the regions to decompress.
    DecompressMemoryInfoEXT -> Vector DecompressMemoryRegionEXT
regions :: Vector DecompressMemoryRegionEXT
  }
  deriving (Typeable)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (DecompressMemoryInfoEXT)
#endif
deriving instance Show DecompressMemoryInfoEXT

instance ToCStruct DecompressMemoryInfoEXT where
  withCStruct :: forall b.
DecompressMemoryInfoEXT
-> (Ptr DecompressMemoryInfoEXT -> IO b) -> IO b
withCStruct DecompressMemoryInfoEXT
x Ptr DecompressMemoryInfoEXT -> IO b
f = Int -> (Ptr DecompressMemoryInfoEXT -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
40 ((Ptr DecompressMemoryInfoEXT -> IO b) -> IO b)
-> (Ptr DecompressMemoryInfoEXT -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr DecompressMemoryInfoEXT
p -> Ptr DecompressMemoryInfoEXT
-> DecompressMemoryInfoEXT -> IO b -> IO b
forall b.
Ptr DecompressMemoryInfoEXT
-> DecompressMemoryInfoEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr DecompressMemoryInfoEXT
p DecompressMemoryInfoEXT
x (Ptr DecompressMemoryInfoEXT -> IO b
f Ptr DecompressMemoryInfoEXT
p)
  pokeCStruct :: forall b.
Ptr DecompressMemoryInfoEXT
-> DecompressMemoryInfoEXT -> IO b -> IO b
pokeCStruct Ptr DecompressMemoryInfoEXT
p DecompressMemoryInfoEXT{Vector DecompressMemoryRegionEXT
MemoryDecompressionMethodFlagsEXT
decompressionMethod :: DecompressMemoryInfoEXT -> MemoryDecompressionMethodFlagsEXT
regions :: DecompressMemoryInfoEXT -> Vector DecompressMemoryRegionEXT
decompressionMethod :: MemoryDecompressionMethodFlagsEXT
regions :: Vector DecompressMemoryRegionEXT
..} IO b
f = ContT b IO b -> IO b
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT b IO b -> IO b) -> ContT b IO b -> IO b
forall a b. (a -> b) -> a -> b
$ do
    IO () -> ContT b IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT b m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryInfoEXT
p Ptr DecompressMemoryInfoEXT -> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_DECOMPRESS_MEMORY_INFO_EXT)
    IO () -> ContT b IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT b m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryInfoEXT
p Ptr DecompressMemoryInfoEXT -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    IO () -> ContT b IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT b m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryInfoEXT
p Ptr DecompressMemoryInfoEXT
-> Int -> Ptr MemoryDecompressionMethodFlagsEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr MemoryDecompressionMethodFlagsEXT)) (MemoryDecompressionMethodFlagsEXT
decompressionMethod)
    IO () -> ContT b IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT b m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr ("maxDecompressionCount" ::: Word32)
-> ("maxDecompressionCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryInfoEXT
p Ptr DecompressMemoryInfoEXT
-> Int -> Ptr ("maxDecompressionCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr Word32)) ((Int -> "maxDecompressionCount" ::: Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Vector DecompressMemoryRegionEXT -> Int
forall a. Vector a -> Int
Data.Vector.length (Vector DecompressMemoryRegionEXT -> Int)
-> Vector DecompressMemoryRegionEXT -> Int
forall a b. (a -> b) -> a -> b
$ (Vector DecompressMemoryRegionEXT
regions)) :: Word32))
    pPRegions' <- ((Ptr DecompressMemoryRegionEXT -> IO b) -> IO b)
-> ContT b IO (Ptr DecompressMemoryRegionEXT)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr DecompressMemoryRegionEXT -> IO b) -> IO b)
 -> ContT b IO (Ptr DecompressMemoryRegionEXT))
-> ((Ptr DecompressMemoryRegionEXT -> IO b) -> IO b)
-> ContT b IO (Ptr DecompressMemoryRegionEXT)
forall a b. (a -> b) -> a -> b
$ forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes @DecompressMemoryRegionEXT ((Vector DecompressMemoryRegionEXT -> Int
forall a. Vector a -> Int
Data.Vector.length (Vector DecompressMemoryRegionEXT
regions)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
32)
    lift $ Data.Vector.imapM_ (\Int
i DecompressMemoryRegionEXT
e -> Ptr DecompressMemoryRegionEXT -> DecompressMemoryRegionEXT -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr DecompressMemoryRegionEXT
pPRegions' Ptr DecompressMemoryRegionEXT
-> Int -> Ptr DecompressMemoryRegionEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
32 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr DecompressMemoryRegionEXT) (DecompressMemoryRegionEXT
e)) (regions)
    lift $ poke ((p `plusPtr` 32 :: Ptr (Ptr DecompressMemoryRegionEXT))) (pPRegions')
    lift $ f
  cStructSize :: Int
cStructSize = Int
40
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b. Ptr DecompressMemoryInfoEXT -> IO b -> IO b
pokeZeroCStruct Ptr DecompressMemoryInfoEXT
p IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryInfoEXT
p Ptr DecompressMemoryInfoEXT -> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_DECOMPRESS_MEMORY_INFO_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryInfoEXT
p Ptr DecompressMemoryInfoEXT -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DecompressMemoryInfoEXT
p Ptr DecompressMemoryInfoEXT
-> Int -> Ptr MemoryDecompressionMethodFlagsEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr MemoryDecompressionMethodFlagsEXT)) (MemoryDecompressionMethodFlagsEXT
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct DecompressMemoryInfoEXT where
  peekCStruct :: Ptr DecompressMemoryInfoEXT -> IO DecompressMemoryInfoEXT
peekCStruct Ptr DecompressMemoryInfoEXT
p = do
    decompressionMethod <- forall a. Storable a => Ptr a -> IO a
peek @MemoryDecompressionMethodFlagsEXT ((Ptr DecompressMemoryInfoEXT
p Ptr DecompressMemoryInfoEXT
-> Int -> Ptr MemoryDecompressionMethodFlagsEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr MemoryDecompressionMethodFlagsEXT))
    regionCount <- peek @Word32 ((p `plusPtr` 24 :: Ptr Word32))
    pRegions <- peek @(Ptr DecompressMemoryRegionEXT) ((p `plusPtr` 32 :: Ptr (Ptr DecompressMemoryRegionEXT)))
    pRegions' <- generateM (fromIntegral regionCount) (\Int
i -> forall a. FromCStruct a => Ptr a -> IO a
peekCStruct @DecompressMemoryRegionEXT ((Ptr DecompressMemoryRegionEXT
pRegions Ptr DecompressMemoryRegionEXT
-> Int -> Ptr DecompressMemoryRegionEXT
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (Int
32 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr DecompressMemoryRegionEXT)))
    pure $ DecompressMemoryInfoEXT
             decompressionMethod pRegions'

instance Zero DecompressMemoryInfoEXT where
  zero :: DecompressMemoryInfoEXT
zero = MemoryDecompressionMethodFlagsEXT
-> Vector DecompressMemoryRegionEXT -> DecompressMemoryInfoEXT
DecompressMemoryInfoEXT
           MemoryDecompressionMethodFlagsEXT
forall a. Zero a => a
zero
           Vector DecompressMemoryRegionEXT
forall a. Monoid a => a
mempty


type MemoryDecompressionMethodFlagsEXT = MemoryDecompressionMethodFlagBitsEXT

-- | VkMemoryDecompressionMethodFlagBitsEXT - List the supported memory
-- decompression methods
--
-- = Description
--
-- -   'MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT' specifies that
--     the GDeflate 1.0 algorithm is used to decompress data.
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_memory_decompression VK_EXT_memory_decompression>,
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_NV_memory_decompression VK_NV_memory_decompression>,
-- 'MemoryDecompressionMethodFlagsEXT'
newtype MemoryDecompressionMethodFlagBitsEXT = MemoryDecompressionMethodFlagBitsEXT Flags64
  deriving newtype (MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
(MemoryDecompressionMethodFlagsEXT
 -> MemoryDecompressionMethodFlagsEXT -> Bool)
-> (MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT -> Bool)
-> Eq MemoryDecompressionMethodFlagsEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
== :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
$c/= :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
/= :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
Eq, Eq MemoryDecompressionMethodFlagsEXT
Eq MemoryDecompressionMethodFlagsEXT =>
(MemoryDecompressionMethodFlagsEXT
 -> MemoryDecompressionMethodFlagsEXT -> Ordering)
-> (MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT -> Bool)
-> (MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT -> Bool)
-> (MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT -> Bool)
-> (MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT -> Bool)
-> (MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT)
-> Ord MemoryDecompressionMethodFlagsEXT
MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Ordering
MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
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
$ccompare :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Ordering
compare :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Ordering
$c< :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
< :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
$c<= :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
<= :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
$c> :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
> :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
$c>= :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
>= :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> Bool
$cmax :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
max :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
$cmin :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
min :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
Ord, Ptr MemoryDecompressionMethodFlagsEXT
-> IO MemoryDecompressionMethodFlagsEXT
Ptr MemoryDecompressionMethodFlagsEXT
-> Int -> IO MemoryDecompressionMethodFlagsEXT
Ptr MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT -> IO ()
Ptr MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> IO ()
MemoryDecompressionMethodFlagsEXT -> Int
(MemoryDecompressionMethodFlagsEXT -> Int)
-> (MemoryDecompressionMethodFlagsEXT -> Int)
-> (Ptr MemoryDecompressionMethodFlagsEXT
    -> Int -> IO MemoryDecompressionMethodFlagsEXT)
-> (Ptr MemoryDecompressionMethodFlagsEXT
    -> Int -> MemoryDecompressionMethodFlagsEXT -> IO ())
-> (forall b. Ptr b -> Int -> IO MemoryDecompressionMethodFlagsEXT)
-> (forall b.
    Ptr b -> Int -> MemoryDecompressionMethodFlagsEXT -> IO ())
-> (Ptr MemoryDecompressionMethodFlagsEXT
    -> IO MemoryDecompressionMethodFlagsEXT)
-> (Ptr MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT -> IO ())
-> Storable MemoryDecompressionMethodFlagsEXT
forall b. Ptr b -> Int -> IO MemoryDecompressionMethodFlagsEXT
forall b.
Ptr b -> Int -> MemoryDecompressionMethodFlagsEXT -> 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
$csizeOf :: MemoryDecompressionMethodFlagsEXT -> Int
sizeOf :: MemoryDecompressionMethodFlagsEXT -> Int
$calignment :: MemoryDecompressionMethodFlagsEXT -> Int
alignment :: MemoryDecompressionMethodFlagsEXT -> Int
$cpeekElemOff :: Ptr MemoryDecompressionMethodFlagsEXT
-> Int -> IO MemoryDecompressionMethodFlagsEXT
peekElemOff :: Ptr MemoryDecompressionMethodFlagsEXT
-> Int -> IO MemoryDecompressionMethodFlagsEXT
$cpokeElemOff :: Ptr MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT -> IO ()
pokeElemOff :: Ptr MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT -> IO ()
$cpeekByteOff :: forall b. Ptr b -> Int -> IO MemoryDecompressionMethodFlagsEXT
peekByteOff :: forall b. Ptr b -> Int -> IO MemoryDecompressionMethodFlagsEXT
$cpokeByteOff :: forall b.
Ptr b -> Int -> MemoryDecompressionMethodFlagsEXT -> IO ()
pokeByteOff :: forall b.
Ptr b -> Int -> MemoryDecompressionMethodFlagsEXT -> IO ()
$cpeek :: Ptr MemoryDecompressionMethodFlagsEXT
-> IO MemoryDecompressionMethodFlagsEXT
peek :: Ptr MemoryDecompressionMethodFlagsEXT
-> IO MemoryDecompressionMethodFlagsEXT
$cpoke :: Ptr MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> IO ()
poke :: Ptr MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT -> IO ()
Storable, MemoryDecompressionMethodFlagsEXT
MemoryDecompressionMethodFlagsEXT
-> Zero MemoryDecompressionMethodFlagsEXT
forall a. a -> Zero a
$czero :: MemoryDecompressionMethodFlagsEXT
zero :: MemoryDecompressionMethodFlagsEXT
Zero, Eq MemoryDecompressionMethodFlagsEXT
MemoryDecompressionMethodFlagsEXT
Eq MemoryDecompressionMethodFlagsEXT =>
(MemoryDecompressionMethodFlagsEXT
 -> MemoryDecompressionMethodFlagsEXT
 -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> Int -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> Int -> MemoryDecompressionMethodFlagsEXT)
-> MemoryDecompressionMethodFlagsEXT
-> (Int -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> Int -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> Int -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> Int -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT -> Int -> Bool)
-> (MemoryDecompressionMethodFlagsEXT -> Maybe Int)
-> (MemoryDecompressionMethodFlagsEXT -> Int)
-> (MemoryDecompressionMethodFlagsEXT -> Bool)
-> (MemoryDecompressionMethodFlagsEXT
    -> Int -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> Int -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> Int -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> Int -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> Int -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT
    -> Int -> MemoryDecompressionMethodFlagsEXT)
-> (MemoryDecompressionMethodFlagsEXT -> Int)
-> Bits MemoryDecompressionMethodFlagsEXT
Int -> MemoryDecompressionMethodFlagsEXT
MemoryDecompressionMethodFlagsEXT -> Bool
MemoryDecompressionMethodFlagsEXT -> Int
MemoryDecompressionMethodFlagsEXT -> Maybe Int
MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
MemoryDecompressionMethodFlagsEXT -> Int -> Bool
MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
forall a.
Eq a =>
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> a
-> (Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> Bool)
-> (a -> Maybe Int)
-> (a -> Int)
-> (a -> Bool)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int)
-> Bits a
$c.&. :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
.&. :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
$c.|. :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
.|. :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
$cxor :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
xor :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
$ccomplement :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
complement :: MemoryDecompressionMethodFlagsEXT
-> MemoryDecompressionMethodFlagsEXT
$cshift :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
shift :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
$crotate :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
rotate :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
$czeroBits :: MemoryDecompressionMethodFlagsEXT
zeroBits :: MemoryDecompressionMethodFlagsEXT
$cbit :: Int -> MemoryDecompressionMethodFlagsEXT
bit :: Int -> MemoryDecompressionMethodFlagsEXT
$csetBit :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
setBit :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
$cclearBit :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
clearBit :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
$ccomplementBit :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
complementBit :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
$ctestBit :: MemoryDecompressionMethodFlagsEXT -> Int -> Bool
testBit :: MemoryDecompressionMethodFlagsEXT -> Int -> Bool
$cbitSizeMaybe :: MemoryDecompressionMethodFlagsEXT -> Maybe Int
bitSizeMaybe :: MemoryDecompressionMethodFlagsEXT -> Maybe Int
$cbitSize :: MemoryDecompressionMethodFlagsEXT -> Int
bitSize :: MemoryDecompressionMethodFlagsEXT -> Int
$cisSigned :: MemoryDecompressionMethodFlagsEXT -> Bool
isSigned :: MemoryDecompressionMethodFlagsEXT -> Bool
$cshiftL :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
shiftL :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
$cunsafeShiftL :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
unsafeShiftL :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
$cshiftR :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
shiftR :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
$cunsafeShiftR :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
unsafeShiftR :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
$crotateL :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
rotateL :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
$crotateR :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
rotateR :: MemoryDecompressionMethodFlagsEXT
-> Int -> MemoryDecompressionMethodFlagsEXT
$cpopCount :: MemoryDecompressionMethodFlagsEXT -> Int
popCount :: MemoryDecompressionMethodFlagsEXT -> Int
Bits, Bits MemoryDecompressionMethodFlagsEXT
Bits MemoryDecompressionMethodFlagsEXT =>
(MemoryDecompressionMethodFlagsEXT -> Int)
-> (MemoryDecompressionMethodFlagsEXT -> Int)
-> (MemoryDecompressionMethodFlagsEXT -> Int)
-> FiniteBits MemoryDecompressionMethodFlagsEXT
MemoryDecompressionMethodFlagsEXT -> Int
forall b.
Bits b =>
(b -> Int) -> (b -> Int) -> (b -> Int) -> FiniteBits b
$cfiniteBitSize :: MemoryDecompressionMethodFlagsEXT -> Int
finiteBitSize :: MemoryDecompressionMethodFlagsEXT -> Int
$ccountLeadingZeros :: MemoryDecompressionMethodFlagsEXT -> Int
countLeadingZeros :: MemoryDecompressionMethodFlagsEXT -> Int
$ccountTrailingZeros :: MemoryDecompressionMethodFlagsEXT -> Int
countTrailingZeros :: MemoryDecompressionMethodFlagsEXT -> Int
FiniteBits)

-- No documentation found for Nested "VkMemoryDecompressionMethodFlagBitsEXT" "VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT"
pattern $mMEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT :: forall {r}.
MemoryDecompressionMethodFlagsEXT
-> ((# #) -> r) -> ((# #) -> r) -> r
$bMEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT :: MemoryDecompressionMethodFlagsEXT
MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT = MemoryDecompressionMethodFlagBitsEXT 0x0000000000000001

conNameMemoryDecompressionMethodFlagBitsEXT :: String
conNameMemoryDecompressionMethodFlagBitsEXT :: String
conNameMemoryDecompressionMethodFlagBitsEXT = String
"MemoryDecompressionMethodFlagBitsEXT"

enumPrefixMemoryDecompressionMethodFlagBitsEXT :: String
enumPrefixMemoryDecompressionMethodFlagBitsEXT :: String
enumPrefixMemoryDecompressionMethodFlagBitsEXT = String
"MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT"

showTableMemoryDecompressionMethodFlagBitsEXT :: [(MemoryDecompressionMethodFlagBitsEXT, String)]
showTableMemoryDecompressionMethodFlagBitsEXT :: [(MemoryDecompressionMethodFlagsEXT, String)]
showTableMemoryDecompressionMethodFlagBitsEXT =
  [
    ( MemoryDecompressionMethodFlagsEXT
MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT
    , String
""
    )
  ]

instance Show MemoryDecompressionMethodFlagBitsEXT where
  showsPrec :: Int -> MemoryDecompressionMethodFlagsEXT -> ShowS
showsPrec =
    String
-> [(MemoryDecompressionMethodFlagsEXT, String)]
-> String
-> (MemoryDecompressionMethodFlagsEXT -> Word64)
-> (Word64 -> ShowS)
-> Int
-> MemoryDecompressionMethodFlagsEXT
-> ShowS
forall a i.
Eq a =>
String
-> [(a, String)]
-> String
-> (a -> i)
-> (i -> ShowS)
-> Int
-> a
-> ShowS
enumShowsPrec
      String
enumPrefixMemoryDecompressionMethodFlagBitsEXT
      [(MemoryDecompressionMethodFlagsEXT, String)]
showTableMemoryDecompressionMethodFlagBitsEXT
      String
conNameMemoryDecompressionMethodFlagBitsEXT
      (\(MemoryDecompressionMethodFlagBitsEXT Word64
x) -> Word64
x)
      (\Word64
x -> String -> ShowS
showString String
"0x" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> ShowS
forall a. Integral a => a -> ShowS
showHex Word64
x)

instance Read MemoryDecompressionMethodFlagBitsEXT where
  readPrec :: ReadPrec MemoryDecompressionMethodFlagsEXT
readPrec =
    String
-> [(MemoryDecompressionMethodFlagsEXT, String)]
-> String
-> (Word64 -> MemoryDecompressionMethodFlagsEXT)
-> ReadPrec MemoryDecompressionMethodFlagsEXT
forall i a.
Read i =>
String -> [(a, String)] -> String -> (i -> a) -> ReadPrec a
enumReadPrec
      String
enumPrefixMemoryDecompressionMethodFlagBitsEXT
      [(MemoryDecompressionMethodFlagsEXT, String)]
showTableMemoryDecompressionMethodFlagBitsEXT
      String
conNameMemoryDecompressionMethodFlagBitsEXT
      Word64 -> MemoryDecompressionMethodFlagsEXT
MemoryDecompressionMethodFlagBitsEXT

type EXT_MEMORY_DECOMPRESSION_SPEC_VERSION = 1

-- No documentation found for TopLevel "VK_EXT_MEMORY_DECOMPRESSION_SPEC_VERSION"
pattern EXT_MEMORY_DECOMPRESSION_SPEC_VERSION :: forall a . Integral a => a
pattern $mEXT_MEMORY_DECOMPRESSION_SPEC_VERSION :: forall {r} {a}.
Integral a =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
$bEXT_MEMORY_DECOMPRESSION_SPEC_VERSION :: forall a. Integral a => a
EXT_MEMORY_DECOMPRESSION_SPEC_VERSION = 1


type EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME = "VK_EXT_memory_decompression"

-- No documentation found for TopLevel "VK_EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME"
pattern EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $mEXT_MEMORY_DECOMPRESSION_EXTENSION_NAME :: forall {r} {a}.
(Eq a, IsString a) =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
$bEXT_MEMORY_DECOMPRESSION_EXTENSION_NAME :: forall a. (Eq a, IsString a) => a
EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME = "VK_EXT_memory_decompression"