{-# language CPP #-}
module Vulkan.Extensions.VK_EXT_transform_feedback  ( cmdBindTransformFeedbackBuffersEXT
                                                    , cmdBeginTransformFeedbackEXT
                                                    , cmdUseTransformFeedbackEXT
                                                    , cmdEndTransformFeedbackEXT
                                                    , cmdBeginQueryIndexedEXT
                                                    , cmdUseQueryIndexedEXT
                                                    , cmdEndQueryIndexedEXT
                                                    , cmdDrawIndirectByteCountEXT
                                                    , PhysicalDeviceTransformFeedbackFeaturesEXT(..)
                                                    , PhysicalDeviceTransformFeedbackPropertiesEXT(..)
                                                    , PipelineRasterizationStateStreamCreateInfoEXT(..)
                                                    , PipelineRasterizationStateStreamCreateFlagsEXT(..)
                                                    , EXT_TRANSFORM_FEEDBACK_SPEC_VERSION
                                                    , pattern EXT_TRANSFORM_FEEDBACK_SPEC_VERSION
                                                    , EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME
                                                    , pattern EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME
                                                    ) where

import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Foreign.Marshal.Alloc (allocaBytesAligned)
import GHC.IO (throwIO)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import GHC.Read (choose)
import GHC.Read (expectP)
import GHC.Read (parens)
import GHC.Show (showParen)
import GHC.Show (showString)
import Numeric (showHex)
import Text.ParserCombinators.ReadPrec ((+++))
import Text.ParserCombinators.ReadPrec (prec)
import Text.ParserCombinators.ReadPrec (step)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (evalContT)
import qualified Data.Vector (imapM_)
import qualified Data.Vector (length)
import qualified Data.Vector (null)
import Control.Monad.IO.Class (MonadIO)
import Data.Bits (Bits)
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 Data.Word (Word32)
import Text.Read.Lex (Lexeme(Ident))
import Data.Kind (Type)
import Control.Monad.Trans.Cont (ContT(..))
import Data.Vector (Vector)
import Vulkan.Core10.FundamentalTypes (bool32ToBool)
import Vulkan.Core10.FundamentalTypes (boolToBool32)
import Vulkan.NamedType ((:::))
import Vulkan.Core10.FundamentalTypes (Bool32)
import Vulkan.Core10.Handles (Buffer)
import Vulkan.Core10.Handles (Buffer(..))
import Vulkan.Core10.Handles (CommandBuffer)
import Vulkan.Core10.Handles (CommandBuffer(..))
import Vulkan.Core10.Handles (CommandBuffer_T)
import Vulkan.Dynamic (DeviceCmds(pVkCmdBeginQueryIndexedEXT))
import Vulkan.Dynamic (DeviceCmds(pVkCmdBeginTransformFeedbackEXT))
import Vulkan.Dynamic (DeviceCmds(pVkCmdBindTransformFeedbackBuffersEXT))
import Vulkan.Dynamic (DeviceCmds(pVkCmdDrawIndirectByteCountEXT))
import Vulkan.Dynamic (DeviceCmds(pVkCmdEndQueryIndexedEXT))
import Vulkan.Dynamic (DeviceCmds(pVkCmdEndTransformFeedbackEXT))
import Vulkan.Core10.FundamentalTypes (DeviceSize)
import Vulkan.Core10.FundamentalTypes (Flags)
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.Core10.Enums.QueryControlFlagBits (QueryControlFlagBits(..))
import Vulkan.Core10.Enums.QueryControlFlagBits (QueryControlFlags)
import Vulkan.Core10.Handles (QueryPool)
import Vulkan.Core10.Handles (QueryPool(..))
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Zero (Zero)
import Vulkan.Zero (Zero(..))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCmdBindTransformFeedbackBuffersEXT
  :: FunPtr (Ptr CommandBuffer_T -> Word32 -> Word32 -> Ptr Buffer -> Ptr DeviceSize -> Ptr DeviceSize -> IO ()) -> Ptr CommandBuffer_T -> Word32 -> Word32 -> Ptr Buffer -> Ptr DeviceSize -> Ptr DeviceSize -> IO ()

-- | vkCmdBindTransformFeedbackBuffersEXT - Bind transform feedback buffers
-- to a command buffer
--
-- = Description
--
-- The values taken from elements i of @pBuffers@, @pOffsets@ and @pSizes@
-- replace the current state for the transform feedback binding
-- @firstBinding@ + i, for i in [0, @bindingCount@). The transform feedback
-- binding is updated to start at the offset indicated by @pOffsets@[i]
-- from the start of the buffer @pBuffers@[i].
--
-- == Valid Usage
--
-- -   'PhysicalDeviceTransformFeedbackFeaturesEXT'::@transformFeedback@
--     /must/ be enabled
--
-- -   @firstBinding@ /must/ be less than
--     'PhysicalDeviceTransformFeedbackPropertiesEXT'::@maxTransformFeedbackBuffers@
--
-- -   The sum of @firstBinding@ and @bindingCount@ /must/ be less than or
--     equal to
--     'PhysicalDeviceTransformFeedbackPropertiesEXT'::@maxTransformFeedbackBuffers@
--
-- -   All elements of @pOffsets@ /must/ be less than the size of the
--     corresponding element in @pBuffers@
--
-- -   All elements of @pOffsets@ /must/ be a multiple of 4
--
-- -   All elements of @pBuffers@ /must/ have been created with the
--     'Vulkan.Core10.Enums.BufferUsageFlagBits.BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT'
--     flag
--
-- -   If the optional @pSize@ array is specified, each element of @pSizes@
--     /must/ either be 'Vulkan.Core10.APIConstants.WHOLE_SIZE', or be less
--     than or equal to
--     'PhysicalDeviceTransformFeedbackPropertiesEXT'::@maxTransformFeedbackBufferSize@
--
-- -   All elements of @pSizes@ /must/ be less than or equal to the size of
--     the corresponding buffer in @pBuffers@
--
-- -   All elements of @pOffsets@ plus @pSizes@, where the @pSizes@,
--     element is not 'Vulkan.Core10.APIConstants.WHOLE_SIZE', /must/ be
--     less than or equal to the size of the corresponding element in
--     @pBuffers@
--
-- -   Each element of @pBuffers@ that is non-sparse /must/ be bound
--     completely and contiguously to a single
--     'Vulkan.Core10.Handles.DeviceMemory' object
--
-- -   Transform feedback /must/ not be active when the
--     'cmdBindTransformFeedbackBuffersEXT' command is recorded
--
-- == Valid Usage (Implicit)
--
-- -   @commandBuffer@ /must/ be a valid
--     'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   @pBuffers@ /must/ be a valid pointer to an array of @bindingCount@
--     valid 'Vulkan.Core10.Handles.Buffer' handles
--
-- -   @pOffsets@ /must/ be a valid pointer to an array of @bindingCount@
--     'Vulkan.Core10.FundamentalTypes.DeviceSize' values
--
-- -   @commandBuffer@ /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   The 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   @bindingCount@ /must/ be greater than @0@
--
-- -   Both of @commandBuffer@, and the elements of @pBuffers@ /must/ have
--     been created, allocated, or retrieved from the same
--     'Vulkan.Core10.Handles.Device'
--
-- == 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#VkQueueFlagBits Supported Queue Types> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#synchronization-pipeline-stages-types Pipeline Type> |
-- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+=====================================================================================================================================+
-- | Primary                                                                                                                    | Both                                                                                                                   | Graphics                                                                                                              |                                                                                                                                     |
-- | Secondary                                                                                                                  |                                                                                                                        |                                                                                                                       |                                                                                                                                     |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.Buffer', 'Vulkan.Core10.Handles.CommandBuffer',
-- 'Vulkan.Core10.FundamentalTypes.DeviceSize'
cmdBindTransformFeedbackBuffersEXT :: forall io
                                    . (MonadIO io)
                                   => -- | @commandBuffer@ is the command buffer into which the command is
                                      -- recorded.
                                      CommandBuffer
                                   -> -- | @firstBinding@ is the index of the first transform feedback binding
                                      -- whose state is updated by the command.
                                      ("firstBinding" ::: Word32)
                                   -> -- | @pBuffers@ is a pointer to an array of buffer handles.
                                      ("buffers" ::: Vector Buffer)
                                   -> -- | @pOffsets@ is a pointer to an array of buffer offsets.
                                      ("offsets" ::: Vector DeviceSize)
                                   -> -- | @pSizes@ is an optional array of buffer sizes, specifying the maximum
                                      -- number of bytes to capture to the corresponding transform feedback
                                      -- buffer. If @pSizes@ is @NULL@, or the value of the @pSizes@ array
                                      -- element is 'Vulkan.Core10.APIConstants.WHOLE_SIZE', then the maximum
                                      -- bytes captured will be the size of the corresponding buffer minus the
                                      -- buffer offset.
                                      ("sizes" ::: Vector DeviceSize)
                                   -> io ()
cmdBindTransformFeedbackBuffersEXT :: CommandBuffer
-> ("firstBinding" ::: Word32)
-> ("buffers" ::: Vector Buffer)
-> ("offsets" ::: Vector DeviceSize)
-> ("offsets" ::: Vector DeviceSize)
-> io ()
cmdBindTransformFeedbackBuffersEXT commandBuffer :: CommandBuffer
commandBuffer firstBinding :: "firstBinding" ::: Word32
firstBinding buffers :: "buffers" ::: Vector Buffer
buffers offsets :: "offsets" ::: Vector DeviceSize
offsets sizes :: "offsets" ::: Vector DeviceSize
sizes = IO () -> io ()
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 vkCmdBindTransformFeedbackBuffersEXTPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
vkCmdBindTransformFeedbackBuffersEXTPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("firstBinding" ::: Word32)
      -> ("firstBinding" ::: Word32)
      -> ("pBuffers" ::: Ptr Buffer)
      -> ("pOffsets" ::: Ptr DeviceSize)
      -> ("pOffsets" ::: Ptr DeviceSize)
      -> IO ())
pVkCmdBindTransformFeedbackBuffersEXT (CommandBuffer -> DeviceCmds
deviceCmds (CommandBuffer
commandBuffer :: CommandBuffer))
  IO () -> ContT () IO ()
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
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
vkCmdBindTransformFeedbackBuffersEXTPtr FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("firstBinding" ::: Word32)
      -> ("firstBinding" ::: Word32)
      -> ("pBuffers" ::: Ptr Buffer)
      -> ("pOffsets" ::: Ptr DeviceSize)
      -> ("pOffsets" ::: Ptr DeviceSize)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "The function pointer for vkCmdBindTransformFeedbackBuffersEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdBindTransformFeedbackBuffersEXT' :: Ptr CommandBuffer_T
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> ("pBuffers" ::: Ptr Buffer)
-> ("pOffsets" ::: Ptr DeviceSize)
-> ("pOffsets" ::: Ptr DeviceSize)
-> IO ()
vkCmdBindTransformFeedbackBuffersEXT' = FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
-> Ptr CommandBuffer_T
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> ("pBuffers" ::: Ptr Buffer)
-> ("pOffsets" ::: Ptr DeviceSize)
-> ("pOffsets" ::: Ptr DeviceSize)
-> IO ()
mkVkCmdBindTransformFeedbackBuffersEXT FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
vkCmdBindTransformFeedbackBuffersEXTPtr
  let pBuffersLength :: Int
pBuffersLength = ("buffers" ::: Vector Buffer) -> Int
forall a. Vector a -> Int
Data.Vector.length (("buffers" ::: Vector Buffer) -> Int)
-> ("buffers" ::: Vector Buffer) -> Int
forall a b. (a -> b) -> a -> b
$ ("buffers" ::: Vector Buffer
buffers)
  IO () -> ContT () IO ()
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 ((("offsets" ::: Vector DeviceSize) -> Int
forall a. Vector a -> Int
Data.Vector.length (("offsets" ::: Vector DeviceSize) -> Int)
-> ("offsets" ::: Vector DeviceSize) -> Int
forall a b. (a -> b) -> a -> b
$ ("offsets" ::: Vector DeviceSize
offsets)) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
pBuffersLength) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "pOffsets and pBuffers must have the same length" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let pSizesLength :: Int
pSizesLength = ("offsets" ::: Vector DeviceSize) -> Int
forall a. Vector a -> Int
Data.Vector.length (("offsets" ::: Vector DeviceSize) -> Int)
-> ("offsets" ::: Vector DeviceSize) -> Int
forall a b. (a -> b) -> a -> b
$ ("offsets" ::: Vector DeviceSize
sizes)
  IO () -> ContT () IO ()
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 (Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
pSizesLength Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
pBuffersLength Bool -> Bool -> Bool
|| Int
pSizesLength Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "pSizes and pBuffers must have the same length" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  "pBuffers" ::: Ptr Buffer
pPBuffers <- ((("pBuffers" ::: Ptr Buffer) -> IO ()) -> IO ())
-> ContT () IO ("pBuffers" ::: Ptr Buffer)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pBuffers" ::: Ptr Buffer) -> IO ()) -> IO ())
 -> ContT () IO ("pBuffers" ::: Ptr Buffer))
-> ((("pBuffers" ::: Ptr Buffer) -> IO ()) -> IO ())
-> ContT () IO ("pBuffers" ::: Ptr Buffer)
forall a b. (a -> b) -> a -> b
$ Int -> Int -> (("pBuffers" ::: Ptr Buffer) -> IO ()) -> IO ()
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned @Buffer ((("buffers" ::: Vector Buffer) -> Int
forall a. Vector a -> Int
Data.Vector.length ("buffers" ::: Vector Buffer
buffers)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* 8) 8
  IO () -> ContT () IO ()
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
$ (Int -> Buffer -> IO ()) -> ("buffers" ::: Vector Buffer) -> IO ()
forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\i :: Int
i e :: Buffer
e -> ("pBuffers" ::: Ptr Buffer) -> Buffer -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ("pBuffers" ::: Ptr Buffer
pPBuffers ("pBuffers" ::: Ptr Buffer) -> Int -> "pBuffers" ::: Ptr Buffer
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr Buffer) (Buffer
e)) ("buffers" ::: Vector Buffer
buffers)
  "pOffsets" ::: Ptr DeviceSize
pPOffsets <- ((("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ())
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ())
 -> ContT () IO ("pOffsets" ::: Ptr DeviceSize))
-> ((("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ())
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall a b. (a -> b) -> a -> b
$ Int -> Int -> (("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ()
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned @DeviceSize ((("offsets" ::: Vector DeviceSize) -> Int
forall a. Vector a -> Int
Data.Vector.length ("offsets" ::: Vector DeviceSize
offsets)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* 8) 8
  IO () -> ContT () IO ()
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
$ (Int -> DeviceSize -> IO ())
-> ("offsets" ::: Vector DeviceSize) -> IO ()
forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\i :: Int
i e :: DeviceSize
e -> ("pOffsets" ::: Ptr DeviceSize) -> DeviceSize -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ("pOffsets" ::: Ptr DeviceSize
pPOffsets ("pOffsets" ::: Ptr DeviceSize)
-> Int -> "pOffsets" ::: Ptr DeviceSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr DeviceSize) (DeviceSize
e)) ("offsets" ::: Vector DeviceSize
offsets)
  "pOffsets" ::: Ptr DeviceSize
pSizes <- if ("offsets" ::: Vector DeviceSize) -> Bool
forall a. Vector a -> Bool
Data.Vector.null ("offsets" ::: Vector DeviceSize
sizes)
    then ("pOffsets" ::: Ptr DeviceSize)
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall (f :: * -> *) a. Applicative f => a -> f a
pure "pOffsets" ::: Ptr DeviceSize
forall a. Ptr a
nullPtr
    else do
      "pOffsets" ::: Ptr DeviceSize
pPSizes <- ((("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ())
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ())
 -> ContT () IO ("pOffsets" ::: Ptr DeviceSize))
-> ((("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ())
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall a b. (a -> b) -> a -> b
$ Int -> Int -> (("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ()
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned @DeviceSize (((("offsets" ::: Vector DeviceSize) -> Int
forall a. Vector a -> Int
Data.Vector.length ("offsets" ::: Vector DeviceSize
sizes))) Int -> Int -> Int
forall a. Num a => a -> a -> a
* 8) 8
      IO () -> ContT () IO ()
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
$ (Int -> DeviceSize -> IO ())
-> ("offsets" ::: Vector DeviceSize) -> IO ()
forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\i :: Int
i e :: DeviceSize
e -> ("pOffsets" ::: Ptr DeviceSize) -> DeviceSize -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ("pOffsets" ::: Ptr DeviceSize
pPSizes ("pOffsets" ::: Ptr DeviceSize)
-> Int -> "pOffsets" ::: Ptr DeviceSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr DeviceSize) (DeviceSize
e)) (("offsets" ::: Vector DeviceSize
sizes))
      ("pOffsets" ::: Ptr DeviceSize)
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (("pOffsets" ::: Ptr DeviceSize)
 -> ContT () IO ("pOffsets" ::: Ptr DeviceSize))
-> ("pOffsets" ::: Ptr DeviceSize)
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall a b. (a -> b) -> a -> b
$ "pOffsets" ::: Ptr DeviceSize
pPSizes
  IO () -> ContT () IO ()
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
$ Ptr CommandBuffer_T
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> ("pBuffers" ::: Ptr Buffer)
-> ("pOffsets" ::: Ptr DeviceSize)
-> ("pOffsets" ::: Ptr DeviceSize)
-> IO ()
vkCmdBindTransformFeedbackBuffersEXT' (CommandBuffer -> Ptr CommandBuffer_T
commandBufferHandle (CommandBuffer
commandBuffer)) ("firstBinding" ::: Word32
firstBinding) ((Int -> "firstBinding" ::: Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
pBuffersLength :: Word32)) ("pBuffers" ::: Ptr Buffer
pPBuffers) ("pOffsets" ::: Ptr DeviceSize
pPOffsets) "pOffsets" ::: Ptr DeviceSize
pSizes
  () -> ContT () IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> ContT () IO ()) -> () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ ()


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCmdBeginTransformFeedbackEXT
  :: FunPtr (Ptr CommandBuffer_T -> Word32 -> Word32 -> Ptr Buffer -> Ptr DeviceSize -> IO ()) -> Ptr CommandBuffer_T -> Word32 -> Word32 -> Ptr Buffer -> Ptr DeviceSize -> IO ()

-- | vkCmdBeginTransformFeedbackEXT - Make transform feedback active in the
-- command buffer
--
-- = Description
--
-- The active transform feedback buffers will capture primitives emitted
-- from the corresponding @XfbBuffer@ in the bound graphics pipeline. Any
-- @XfbBuffer@ emitted that does not output to an active transform feedback
-- buffer will not be captured.
--
-- == Valid Usage
--
-- -   'PhysicalDeviceTransformFeedbackFeaturesEXT'::@transformFeedback@
--     /must/ be enabled
--
-- -   Transform feedback /must/ not be active
--
-- -   @firstCounterBuffer@ /must/ be less than
--     'PhysicalDeviceTransformFeedbackPropertiesEXT'::@maxTransformFeedbackBuffers@
--
-- -   The sum of @firstCounterBuffer@ and @counterBufferCount@ /must/ be
--     less than or equal to
--     'PhysicalDeviceTransformFeedbackPropertiesEXT'::@maxTransformFeedbackBuffers@
--
-- -   If @counterBufferCount@ is not @0@, and @pCounterBuffers@ is not
--     @NULL@, @pCounterBuffers@ /must/ be a valid pointer to an array of
--     @counterBufferCount@ 'Vulkan.Core10.Handles.Buffer' handles that are
--     either valid or 'Vulkan.Core10.APIConstants.NULL_HANDLE'
--
-- -   For each buffer handle in the array, if it is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE' it /must/ reference a
--     buffer large enough to hold 4 bytes at the corresponding offset from
--     the @pCounterBufferOffsets@ array
--
-- -   If @pCounterBuffer@ is @NULL@, then @pCounterBufferOffsets@ /must/
--     also be @NULL@
--
-- -   For each buffer handle in the @pCounterBuffers@ array that is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE' it /must/ have been created
--     with a @usage@ value containing
--     'Vulkan.Core10.Enums.BufferUsageFlagBits.BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT'
--
-- -   The last vertex processing stage of the bound graphics pipeline
--     /must/ have been declared with the @Xfb@ execution mode
--
-- -   Transform feedback /must/ not be made active in a render pass
--     instance with multiview enabled
--
-- == Valid Usage (Implicit)
--
-- -   @commandBuffer@ /must/ be a valid
--     'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   If @counterBufferCount@ is not @0@, and @pCounterBufferOffsets@ is
--     not @NULL@, @pCounterBufferOffsets@ /must/ be a valid pointer to an
--     array of @counterBufferCount@
--     'Vulkan.Core10.FundamentalTypes.DeviceSize' values
--
-- -   @commandBuffer@ /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   The 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   This command /must/ only be called inside of a render pass instance
--
-- -   Both of @commandBuffer@, and the elements of @pCounterBuffers@ that
--     are valid handles of non-ignored parameters /must/ have been
--     created, allocated, or retrieved from the same
--     'Vulkan.Core10.Handles.Device'
--
-- == 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#VkQueueFlagBits Supported Queue Types> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#synchronization-pipeline-stages-types Pipeline Type> |
-- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+=====================================================================================================================================+
-- | Primary                                                                                                                    | Inside                                                                                                                 | Graphics                                                                                                              |                                                                                                                                     |
-- | Secondary                                                                                                                  |                                                                                                                        |                                                                                                                       |                                                                                                                                     |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.Buffer', 'Vulkan.Core10.Handles.CommandBuffer',
-- 'Vulkan.Core10.FundamentalTypes.DeviceSize'
cmdBeginTransformFeedbackEXT :: forall io
                              . (MonadIO io)
                             => -- | @commandBuffer@ is the command buffer into which the command is
                                -- recorded.
                                CommandBuffer
                             -> -- | @firstCounterBuffer@ is the index of the first transform feedback buffer
                                -- corresponding to @pCounterBuffers@[0] and @pCounterBufferOffsets@[0].
                                ("firstCounterBuffer" ::: Word32)
                             -> -- | @pCounterBuffers@ is an optional array of buffer handles to the counter
                                -- buffers which contain a 4 byte integer value representing the byte
                                -- offset from the start of the corresponding transform feedback buffer
                                -- from where to start capturing vertex data. If the byte offset stored to
                                -- the counter buffer location was done using 'cmdEndTransformFeedbackEXT'
                                -- it can be used to resume transform feedback from the previous location.
                                -- If @pCounterBuffers@ is @NULL@, then transform feedback will start
                                -- capturing vertex data to byte offset zero in all bound transform
                                -- feedback buffers. For each element of @pCounterBuffers@ that is
                                -- 'Vulkan.Core10.APIConstants.NULL_HANDLE', transform feedback will start
                                -- capturing vertex data to byte zero in the corresponding bound transform
                                -- feedback buffer.
                                ("counterBuffers" ::: Vector Buffer)
                             -> -- | @pCounterBufferOffsets@ is an optional array of offsets within each of
                                -- the @pCounterBuffers@ where the counter values were previously written.
                                -- The location in each counter buffer at these offsets /must/ be large
                                -- enough to contain 4 bytes of data. This data is the number of bytes
                                -- captured by the previous transform feedback to this buffer. If
                                -- @pCounterBufferOffsets@ is @NULL@, then it is assumed the offsets are
                                -- zero.
                                ("counterBufferOffsets" ::: Vector DeviceSize)
                             -> io ()
cmdBeginTransformFeedbackEXT :: CommandBuffer
-> ("firstBinding" ::: Word32)
-> ("buffers" ::: Vector Buffer)
-> ("offsets" ::: Vector DeviceSize)
-> io ()
cmdBeginTransformFeedbackEXT commandBuffer :: CommandBuffer
commandBuffer firstCounterBuffer :: "firstBinding" ::: Word32
firstCounterBuffer counterBuffers :: "buffers" ::: Vector Buffer
counterBuffers counterBufferOffsets :: "offsets" ::: Vector DeviceSize
counterBufferOffsets = IO () -> io ()
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 vkCmdBeginTransformFeedbackEXTPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
vkCmdBeginTransformFeedbackEXTPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("firstBinding" ::: Word32)
      -> ("firstBinding" ::: Word32)
      -> ("pBuffers" ::: Ptr Buffer)
      -> ("pOffsets" ::: Ptr DeviceSize)
      -> IO ())
pVkCmdBeginTransformFeedbackEXT (CommandBuffer -> DeviceCmds
deviceCmds (CommandBuffer
commandBuffer :: CommandBuffer))
  IO () -> ContT () IO ()
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
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
vkCmdBeginTransformFeedbackEXTPtr FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("firstBinding" ::: Word32)
      -> ("firstBinding" ::: Word32)
      -> ("pBuffers" ::: Ptr Buffer)
      -> ("pOffsets" ::: Ptr DeviceSize)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "The function pointer for vkCmdBeginTransformFeedbackEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdBeginTransformFeedbackEXT' :: Ptr CommandBuffer_T
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> ("pBuffers" ::: Ptr Buffer)
-> ("pOffsets" ::: Ptr DeviceSize)
-> IO ()
vkCmdBeginTransformFeedbackEXT' = FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
-> Ptr CommandBuffer_T
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> ("pBuffers" ::: Ptr Buffer)
-> ("pOffsets" ::: Ptr DeviceSize)
-> IO ()
mkVkCmdBeginTransformFeedbackEXT FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
vkCmdBeginTransformFeedbackEXTPtr
  let pCounterBuffersLength :: Int
pCounterBuffersLength = ("buffers" ::: Vector Buffer) -> Int
forall a. Vector a -> Int
Data.Vector.length (("buffers" ::: Vector Buffer) -> Int)
-> ("buffers" ::: Vector Buffer) -> Int
forall a b. (a -> b) -> a -> b
$ ("buffers" ::: Vector Buffer
counterBuffers)
  let pCounterBufferOffsetsLength :: Int
pCounterBufferOffsetsLength = ("offsets" ::: Vector DeviceSize) -> Int
forall a. Vector a -> Int
Data.Vector.length (("offsets" ::: Vector DeviceSize) -> Int)
-> ("offsets" ::: Vector DeviceSize) -> Int
forall a b. (a -> b) -> a -> b
$ ("offsets" ::: Vector DeviceSize
counterBufferOffsets)
  IO () -> ContT () IO ()
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 (Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
pCounterBufferOffsetsLength Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
pCounterBuffersLength Bool -> Bool -> Bool
|| Int
pCounterBufferOffsetsLength Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "pCounterBufferOffsets and pCounterBuffers must have the same length" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  "pBuffers" ::: Ptr Buffer
pPCounterBuffers <- ((("pBuffers" ::: Ptr Buffer) -> IO ()) -> IO ())
-> ContT () IO ("pBuffers" ::: Ptr Buffer)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pBuffers" ::: Ptr Buffer) -> IO ()) -> IO ())
 -> ContT () IO ("pBuffers" ::: Ptr Buffer))
-> ((("pBuffers" ::: Ptr Buffer) -> IO ()) -> IO ())
-> ContT () IO ("pBuffers" ::: Ptr Buffer)
forall a b. (a -> b) -> a -> b
$ Int -> Int -> (("pBuffers" ::: Ptr Buffer) -> IO ()) -> IO ()
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned @Buffer ((("buffers" ::: Vector Buffer) -> Int
forall a. Vector a -> Int
Data.Vector.length ("buffers" ::: Vector Buffer
counterBuffers)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* 8) 8
  IO () -> ContT () IO ()
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
$ (Int -> Buffer -> IO ()) -> ("buffers" ::: Vector Buffer) -> IO ()
forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\i :: Int
i e :: Buffer
e -> ("pBuffers" ::: Ptr Buffer) -> Buffer -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ("pBuffers" ::: Ptr Buffer
pPCounterBuffers ("pBuffers" ::: Ptr Buffer) -> Int -> "pBuffers" ::: Ptr Buffer
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr Buffer) (Buffer
e)) ("buffers" ::: Vector Buffer
counterBuffers)
  "pOffsets" ::: Ptr DeviceSize
pCounterBufferOffsets <- if ("offsets" ::: Vector DeviceSize) -> Bool
forall a. Vector a -> Bool
Data.Vector.null ("offsets" ::: Vector DeviceSize
counterBufferOffsets)
    then ("pOffsets" ::: Ptr DeviceSize)
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall (f :: * -> *) a. Applicative f => a -> f a
pure "pOffsets" ::: Ptr DeviceSize
forall a. Ptr a
nullPtr
    else do
      "pOffsets" ::: Ptr DeviceSize
pPCounterBufferOffsets <- ((("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ())
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ())
 -> ContT () IO ("pOffsets" ::: Ptr DeviceSize))
-> ((("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ())
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall a b. (a -> b) -> a -> b
$ Int -> Int -> (("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ()
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned @DeviceSize (((("offsets" ::: Vector DeviceSize) -> Int
forall a. Vector a -> Int
Data.Vector.length ("offsets" ::: Vector DeviceSize
counterBufferOffsets))) Int -> Int -> Int
forall a. Num a => a -> a -> a
* 8) 8
      IO () -> ContT () IO ()
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
$ (Int -> DeviceSize -> IO ())
-> ("offsets" ::: Vector DeviceSize) -> IO ()
forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\i :: Int
i e :: DeviceSize
e -> ("pOffsets" ::: Ptr DeviceSize) -> DeviceSize -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ("pOffsets" ::: Ptr DeviceSize
pPCounterBufferOffsets ("pOffsets" ::: Ptr DeviceSize)
-> Int -> "pOffsets" ::: Ptr DeviceSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr DeviceSize) (DeviceSize
e)) (("offsets" ::: Vector DeviceSize
counterBufferOffsets))
      ("pOffsets" ::: Ptr DeviceSize)
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (("pOffsets" ::: Ptr DeviceSize)
 -> ContT () IO ("pOffsets" ::: Ptr DeviceSize))
-> ("pOffsets" ::: Ptr DeviceSize)
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall a b. (a -> b) -> a -> b
$ "pOffsets" ::: Ptr DeviceSize
pPCounterBufferOffsets
  IO () -> ContT () IO ()
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
$ Ptr CommandBuffer_T
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> ("pBuffers" ::: Ptr Buffer)
-> ("pOffsets" ::: Ptr DeviceSize)
-> IO ()
vkCmdBeginTransformFeedbackEXT' (CommandBuffer -> Ptr CommandBuffer_T
commandBufferHandle (CommandBuffer
commandBuffer)) ("firstBinding" ::: Word32
firstCounterBuffer) ((Int -> "firstBinding" ::: Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
pCounterBuffersLength :: Word32)) ("pBuffers" ::: Ptr Buffer
pPCounterBuffers) "pOffsets" ::: Ptr DeviceSize
pCounterBufferOffsets
  () -> ContT () IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> ContT () IO ()) -> () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ ()

-- | This function will call the supplied action between calls to
-- 'cmdBeginTransformFeedbackEXT' and 'cmdEndTransformFeedbackEXT'
--
-- Note that 'cmdEndTransformFeedbackEXT' is *not* called if an exception
-- is thrown by the inner action.
cmdUseTransformFeedbackEXT :: forall io r . MonadIO io => CommandBuffer -> Word32 -> Vector Buffer -> Vector DeviceSize -> io r -> io r
cmdUseTransformFeedbackEXT :: CommandBuffer
-> ("firstBinding" ::: Word32)
-> ("buffers" ::: Vector Buffer)
-> ("offsets" ::: Vector DeviceSize)
-> io r
-> io r
cmdUseTransformFeedbackEXT commandBuffer :: CommandBuffer
commandBuffer firstCounterBuffer :: "firstBinding" ::: Word32
firstCounterBuffer pCounterBuffers :: "buffers" ::: Vector Buffer
pCounterBuffers pCounterBufferOffsets :: "offsets" ::: Vector DeviceSize
pCounterBufferOffsets a :: io r
a =
  (CommandBuffer
-> ("firstBinding" ::: Word32)
-> ("buffers" ::: Vector Buffer)
-> ("offsets" ::: Vector DeviceSize)
-> io ()
forall (io :: * -> *).
MonadIO io =>
CommandBuffer
-> ("firstBinding" ::: Word32)
-> ("buffers" ::: Vector Buffer)
-> ("offsets" ::: Vector DeviceSize)
-> io ()
cmdBeginTransformFeedbackEXT CommandBuffer
commandBuffer "firstBinding" ::: Word32
firstCounterBuffer "buffers" ::: Vector Buffer
pCounterBuffers "offsets" ::: Vector DeviceSize
pCounterBufferOffsets) io () -> io r -> io r
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> io r
a io r -> io () -> io r
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* (CommandBuffer
-> ("firstBinding" ::: Word32)
-> ("buffers" ::: Vector Buffer)
-> ("offsets" ::: Vector DeviceSize)
-> io ()
forall (io :: * -> *).
MonadIO io =>
CommandBuffer
-> ("firstBinding" ::: Word32)
-> ("buffers" ::: Vector Buffer)
-> ("offsets" ::: Vector DeviceSize)
-> io ()
cmdEndTransformFeedbackEXT CommandBuffer
commandBuffer "firstBinding" ::: Word32
firstCounterBuffer "buffers" ::: Vector Buffer
pCounterBuffers "offsets" ::: Vector DeviceSize
pCounterBufferOffsets)


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCmdEndTransformFeedbackEXT
  :: FunPtr (Ptr CommandBuffer_T -> Word32 -> Word32 -> Ptr Buffer -> Ptr DeviceSize -> IO ()) -> Ptr CommandBuffer_T -> Word32 -> Word32 -> Ptr Buffer -> Ptr DeviceSize -> IO ()

-- | vkCmdEndTransformFeedbackEXT - Make transform feedback inactive in the
-- command buffer
--
-- == Valid Usage
--
-- -   'PhysicalDeviceTransformFeedbackFeaturesEXT'::@transformFeedback@
--     /must/ be enabled
--
-- -   Transform feedback /must/ be active
--
-- -   @firstCounterBuffer@ /must/ be less than
--     'PhysicalDeviceTransformFeedbackPropertiesEXT'::@maxTransformFeedbackBuffers@
--
-- -   The sum of @firstCounterBuffer@ and @counterBufferCount@ /must/ be
--     less than or equal to
--     'PhysicalDeviceTransformFeedbackPropertiesEXT'::@maxTransformFeedbackBuffers@
--
-- -   If @counterBufferCount@ is not @0@, and @pCounterBuffers@ is not
--     @NULL@, @pCounterBuffers@ /must/ be a valid pointer to an array of
--     @counterBufferCount@ 'Vulkan.Core10.Handles.Buffer' handles that are
--     either valid or 'Vulkan.Core10.APIConstants.NULL_HANDLE'
--
-- -   For each buffer handle in the array, if it is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE' it /must/ reference a
--     buffer large enough to hold 4 bytes at the corresponding offset from
--     the @pCounterBufferOffsets@ array
--
-- -   If @pCounterBuffer@ is @NULL@, then @pCounterBufferOffsets@ /must/
--     also be @NULL@
--
-- -   For each buffer handle in the @pCounterBuffers@ array that is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE' it /must/ have been created
--     with a @usage@ value containing
--     'Vulkan.Core10.Enums.BufferUsageFlagBits.BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT'
--
-- == Valid Usage (Implicit)
--
-- -   @commandBuffer@ /must/ be a valid
--     'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   If @counterBufferCount@ is not @0@, and @pCounterBufferOffsets@ is
--     not @NULL@, @pCounterBufferOffsets@ /must/ be a valid pointer to an
--     array of @counterBufferCount@
--     'Vulkan.Core10.FundamentalTypes.DeviceSize' values
--
-- -   @commandBuffer@ /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   The 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   This command /must/ only be called inside of a render pass instance
--
-- -   Both of @commandBuffer@, and the elements of @pCounterBuffers@ that
--     are valid handles of non-ignored parameters /must/ have been
--     created, allocated, or retrieved from the same
--     'Vulkan.Core10.Handles.Device'
--
-- == 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#VkQueueFlagBits Supported Queue Types> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#synchronization-pipeline-stages-types Pipeline Type> |
-- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+=====================================================================================================================================+
-- | Primary                                                                                                                    | Inside                                                                                                                 | Graphics                                                                                                              |                                                                                                                                     |
-- | Secondary                                                                                                                  |                                                                                                                        |                                                                                                                       |                                                                                                                                     |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.Buffer', 'Vulkan.Core10.Handles.CommandBuffer',
-- 'Vulkan.Core10.FundamentalTypes.DeviceSize'
cmdEndTransformFeedbackEXT :: forall io
                            . (MonadIO io)
                           => -- | @commandBuffer@ is the command buffer into which the command is
                              -- recorded.
                              CommandBuffer
                           -> -- | @firstCounterBuffer@ is the index of the first transform feedback buffer
                              -- corresponding to @pCounterBuffers@[0] and @pCounterBufferOffsets@[0].
                              ("firstCounterBuffer" ::: Word32)
                           -> -- | @pCounterBuffers@ is an optional array of buffer handles to the counter
                              -- buffers used to record the current byte positions of each transform
                              -- feedback buffer where the next vertex output data would be captured.
                              -- This /can/ be used by a subsequent 'cmdBeginTransformFeedbackEXT' call
                              -- to resume transform feedback capture from this position. It can also be
                              -- used by 'cmdDrawIndirectByteCountEXT' to determine the vertex count of
                              -- the draw call.
                              ("counterBuffers" ::: Vector Buffer)
                           -> -- | @pCounterBufferOffsets@ is an optional array of offsets within each of
                              -- the @pCounterBuffers@ where the counter values can be written. The
                              -- location in each counter buffer at these offsets /must/ be large enough
                              -- to contain 4 bytes of data. The data stored at this location is the byte
                              -- offset from the start of the transform feedback buffer binding where the
                              -- next vertex data would be written. If @pCounterBufferOffsets@ is @NULL@,
                              -- then it is assumed the offsets are zero.
                              ("counterBufferOffsets" ::: Vector DeviceSize)
                           -> io ()
cmdEndTransformFeedbackEXT :: CommandBuffer
-> ("firstBinding" ::: Word32)
-> ("buffers" ::: Vector Buffer)
-> ("offsets" ::: Vector DeviceSize)
-> io ()
cmdEndTransformFeedbackEXT commandBuffer :: CommandBuffer
commandBuffer firstCounterBuffer :: "firstBinding" ::: Word32
firstCounterBuffer counterBuffers :: "buffers" ::: Vector Buffer
counterBuffers counterBufferOffsets :: "offsets" ::: Vector DeviceSize
counterBufferOffsets = IO () -> io ()
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 vkCmdEndTransformFeedbackEXTPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
vkCmdEndTransformFeedbackEXTPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("firstBinding" ::: Word32)
      -> ("firstBinding" ::: Word32)
      -> ("pBuffers" ::: Ptr Buffer)
      -> ("pOffsets" ::: Ptr DeviceSize)
      -> IO ())
pVkCmdEndTransformFeedbackEXT (CommandBuffer -> DeviceCmds
deviceCmds (CommandBuffer
commandBuffer :: CommandBuffer))
  IO () -> ContT () IO ()
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
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
vkCmdEndTransformFeedbackEXTPtr FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("firstBinding" ::: Word32)
      -> ("firstBinding" ::: Word32)
      -> ("pBuffers" ::: Ptr Buffer)
      -> ("pOffsets" ::: Ptr DeviceSize)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "The function pointer for vkCmdEndTransformFeedbackEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdEndTransformFeedbackEXT' :: Ptr CommandBuffer_T
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> ("pBuffers" ::: Ptr Buffer)
-> ("pOffsets" ::: Ptr DeviceSize)
-> IO ()
vkCmdEndTransformFeedbackEXT' = FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
-> Ptr CommandBuffer_T
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> ("pBuffers" ::: Ptr Buffer)
-> ("pOffsets" ::: Ptr DeviceSize)
-> IO ()
mkVkCmdEndTransformFeedbackEXT FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> ("pBuffers" ::: Ptr Buffer)
   -> ("pOffsets" ::: Ptr DeviceSize)
   -> IO ())
vkCmdEndTransformFeedbackEXTPtr
  let pCounterBuffersLength :: Int
pCounterBuffersLength = ("buffers" ::: Vector Buffer) -> Int
forall a. Vector a -> Int
Data.Vector.length (("buffers" ::: Vector Buffer) -> Int)
-> ("buffers" ::: Vector Buffer) -> Int
forall a b. (a -> b) -> a -> b
$ ("buffers" ::: Vector Buffer
counterBuffers)
  let pCounterBufferOffsetsLength :: Int
pCounterBufferOffsetsLength = ("offsets" ::: Vector DeviceSize) -> Int
forall a. Vector a -> Int
Data.Vector.length (("offsets" ::: Vector DeviceSize) -> Int)
-> ("offsets" ::: Vector DeviceSize) -> Int
forall a b. (a -> b) -> a -> b
$ ("offsets" ::: Vector DeviceSize
counterBufferOffsets)
  IO () -> ContT () IO ()
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 (Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
pCounterBufferOffsetsLength Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
pCounterBuffersLength Bool -> Bool -> Bool
|| Int
pCounterBufferOffsetsLength Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "pCounterBufferOffsets and pCounterBuffers must have the same length" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  "pBuffers" ::: Ptr Buffer
pPCounterBuffers <- ((("pBuffers" ::: Ptr Buffer) -> IO ()) -> IO ())
-> ContT () IO ("pBuffers" ::: Ptr Buffer)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pBuffers" ::: Ptr Buffer) -> IO ()) -> IO ())
 -> ContT () IO ("pBuffers" ::: Ptr Buffer))
-> ((("pBuffers" ::: Ptr Buffer) -> IO ()) -> IO ())
-> ContT () IO ("pBuffers" ::: Ptr Buffer)
forall a b. (a -> b) -> a -> b
$ Int -> Int -> (("pBuffers" ::: Ptr Buffer) -> IO ()) -> IO ()
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned @Buffer ((("buffers" ::: Vector Buffer) -> Int
forall a. Vector a -> Int
Data.Vector.length ("buffers" ::: Vector Buffer
counterBuffers)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* 8) 8
  IO () -> ContT () IO ()
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
$ (Int -> Buffer -> IO ()) -> ("buffers" ::: Vector Buffer) -> IO ()
forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\i :: Int
i e :: Buffer
e -> ("pBuffers" ::: Ptr Buffer) -> Buffer -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ("pBuffers" ::: Ptr Buffer
pPCounterBuffers ("pBuffers" ::: Ptr Buffer) -> Int -> "pBuffers" ::: Ptr Buffer
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr Buffer) (Buffer
e)) ("buffers" ::: Vector Buffer
counterBuffers)
  "pOffsets" ::: Ptr DeviceSize
pCounterBufferOffsets <- if ("offsets" ::: Vector DeviceSize) -> Bool
forall a. Vector a -> Bool
Data.Vector.null ("offsets" ::: Vector DeviceSize
counterBufferOffsets)
    then ("pOffsets" ::: Ptr DeviceSize)
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall (f :: * -> *) a. Applicative f => a -> f a
pure "pOffsets" ::: Ptr DeviceSize
forall a. Ptr a
nullPtr
    else do
      "pOffsets" ::: Ptr DeviceSize
pPCounterBufferOffsets <- ((("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ())
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ())
 -> ContT () IO ("pOffsets" ::: Ptr DeviceSize))
-> ((("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ())
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall a b. (a -> b) -> a -> b
$ Int -> Int -> (("pOffsets" ::: Ptr DeviceSize) -> IO ()) -> IO ()
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned @DeviceSize (((("offsets" ::: Vector DeviceSize) -> Int
forall a. Vector a -> Int
Data.Vector.length ("offsets" ::: Vector DeviceSize
counterBufferOffsets))) Int -> Int -> Int
forall a. Num a => a -> a -> a
* 8) 8
      IO () -> ContT () IO ()
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
$ (Int -> DeviceSize -> IO ())
-> ("offsets" ::: Vector DeviceSize) -> IO ()
forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\i :: Int
i e :: DeviceSize
e -> ("pOffsets" ::: Ptr DeviceSize) -> DeviceSize -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ("pOffsets" ::: Ptr DeviceSize
pPCounterBufferOffsets ("pOffsets" ::: Ptr DeviceSize)
-> Int -> "pOffsets" ::: Ptr DeviceSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr DeviceSize) (DeviceSize
e)) (("offsets" ::: Vector DeviceSize
counterBufferOffsets))
      ("pOffsets" ::: Ptr DeviceSize)
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (("pOffsets" ::: Ptr DeviceSize)
 -> ContT () IO ("pOffsets" ::: Ptr DeviceSize))
-> ("pOffsets" ::: Ptr DeviceSize)
-> ContT () IO ("pOffsets" ::: Ptr DeviceSize)
forall a b. (a -> b) -> a -> b
$ "pOffsets" ::: Ptr DeviceSize
pPCounterBufferOffsets
  IO () -> ContT () IO ()
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
$ Ptr CommandBuffer_T
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> ("pBuffers" ::: Ptr Buffer)
-> ("pOffsets" ::: Ptr DeviceSize)
-> IO ()
vkCmdEndTransformFeedbackEXT' (CommandBuffer -> Ptr CommandBuffer_T
commandBufferHandle (CommandBuffer
commandBuffer)) ("firstBinding" ::: Word32
firstCounterBuffer) ((Int -> "firstBinding" ::: Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
pCounterBuffersLength :: Word32)) ("pBuffers" ::: Ptr Buffer
pPCounterBuffers) "pOffsets" ::: Ptr DeviceSize
pCounterBufferOffsets
  () -> ContT () IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> ContT () IO ()) -> () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ ()


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCmdBeginQueryIndexedEXT
  :: FunPtr (Ptr CommandBuffer_T -> QueryPool -> Word32 -> QueryControlFlags -> Word32 -> IO ()) -> Ptr CommandBuffer_T -> QueryPool -> Word32 -> QueryControlFlags -> Word32 -> IO ()

-- | vkCmdBeginQueryIndexedEXT - Begin an indexed query
--
-- = Description
--
-- The 'cmdBeginQueryIndexedEXT' command operates the same as the
-- 'Vulkan.Core10.CommandBufferBuilding.cmdBeginQuery' command, except that
-- it also accepts a query type specific @index@ parameter.
--
-- == Valid Usage
--
-- -   @queryPool@ /must/ have been created with a @queryType@ that differs
--     from that of any queries that are
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#queries-operation-active active>
--     within @commandBuffer@
--
-- -   All queries used by the command /must/ be unavailable
--
-- -   The @queryType@ used to create @queryPool@ /must/ not be
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_TIMESTAMP'
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-occlusionQueryPrecise precise occlusion queries>
--     feature is not enabled, or the @queryType@ used to create
--     @queryPool@ was not
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_OCCLUSION', @flags@ /must/
--     not contain
--     'Vulkan.Core10.Enums.QueryControlFlagBits.QUERY_CONTROL_PRECISE_BIT'
--
-- -   @query@ /must/ be less than the number of queries in @queryPool@
--
-- -   If the @queryType@ used to create @queryPool@ was
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_OCCLUSION', the
--     'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   If the @queryType@ used to create @queryPool@ was
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_PIPELINE_STATISTICS' and
--     any of the @pipelineStatistics@ indicate graphics operations, the
--     'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   If the @queryType@ used to create @queryPool@ was
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_PIPELINE_STATISTICS' and
--     any of the @pipelineStatistics@ indicate compute operations, the
--     'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support compute operations
--
-- -   @commandBuffer@ /must/ not be a protected command buffer
--
-- -   If called within a render pass instance, the sum of @query@ and the
--     number of bits set in the current subpass’s view mask /must/ be less
--     than or equal to the number of queries in @queryPool@
--
-- -   If the @queryType@ used to create @queryPool@ was
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT'
--     the 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   If the @queryType@ used to create @queryPool@ was
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT'
--     the @index@ parameter /must/ be less than
--     'PhysicalDeviceTransformFeedbackPropertiesEXT'::@maxTransformFeedbackStreams@
--
-- -   If the @queryType@ used to create @queryPool@ was not
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT'
--     the @index@ /must/ be zero
--
-- -   If the @queryType@ used to create @queryPool@ was
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT'
--     then
--     'PhysicalDeviceTransformFeedbackPropertiesEXT'::@transformFeedbackQueries@
--     /must/ be supported
--
-- -   If @queryPool@ was created with a @queryType@ of
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_PERFORMANCE_QUERY_KHR',
--     the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#profiling-lock profiling lock>
--     /must/ have been held before
--     'Vulkan.Core10.CommandBuffer.beginCommandBuffer' was called on
--     @commandBuffer@
--
-- -   If @queryPool@ was created with a @queryType@ of
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_PERFORMANCE_QUERY_KHR' and
--     one of the counters used to create @queryPool@ was
--     'Vulkan.Extensions.VK_KHR_performance_query.PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR',
--     the query begin /must/ be the first recorded command in
--     @commandBuffer@
--
-- -   If @queryPool@ was created with a @queryType@ of
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_PERFORMANCE_QUERY_KHR' and
--     one of the counters used to create @queryPool@ was
--     'Vulkan.Extensions.VK_KHR_performance_query.PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR',
--     the begin command /must/ not be recorded within a render pass
--     instance
--
-- -   If @queryPool@ was created with a @queryType@ of
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_PERFORMANCE_QUERY_KHR' and
--     another query pool with a @queryType@
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_PERFORMANCE_QUERY_KHR' has
--     been used within @commandBuffer@, its parent primary command buffer
--     or secondary command buffer recorded within the same parent primary
--     command buffer as @commandBuffer@, the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-performanceCounterMultipleQueryPools performanceCounterMultipleQueryPools>
--     feature /must/ be enabled
--
-- -   If @queryPool@ was created with a @queryType@ of
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_PERFORMANCE_QUERY_KHR',
--     this command /must/ not be recorded in a command buffer that, either
--     directly or through secondary command buffers, also contains a
--     'Vulkan.Core10.CommandBufferBuilding.cmdResetQueryPool' command
--     affecting the same query
--
-- == Valid Usage (Implicit)
--
-- -   @commandBuffer@ /must/ be a valid
--     'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   @queryPool@ /must/ be a valid 'Vulkan.Core10.Handles.QueryPool'
--     handle
--
-- -   @flags@ /must/ be a valid combination of
--     'Vulkan.Core10.Enums.QueryControlFlagBits.QueryControlFlagBits'
--     values
--
-- -   @commandBuffer@ /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   The 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics, or compute operations
--
-- -   Both of @commandBuffer@, and @queryPool@ /must/ have been created,
--     allocated, or retrieved from the same 'Vulkan.Core10.Handles.Device'
--
-- == 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#VkQueueFlagBits Supported Queue Types> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#synchronization-pipeline-stages-types Pipeline Type> |
-- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+=====================================================================================================================================+
-- | Primary                                                                                                                    | Both                                                                                                                   | Graphics                                                                                                              |                                                                                                                                     |
-- | Secondary                                                                                                                  |                                                                                                                        | Compute                                                                                                               |                                                                                                                                     |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.CommandBuffer',
-- 'Vulkan.Core10.Enums.QueryControlFlagBits.QueryControlFlags',
-- 'Vulkan.Core10.Handles.QueryPool'
cmdBeginQueryIndexedEXT :: forall io
                         . (MonadIO io)
                        => -- | @commandBuffer@ is the command buffer into which this command will be
                           -- recorded.
                           CommandBuffer
                        -> -- | @queryPool@ is the query pool that will manage the results of the query.
                           QueryPool
                        -> -- | @query@ is the query index within the query pool that will contain the
                           -- results.
                           ("query" ::: Word32)
                        -> -- | @flags@ is a bitmask of
                           -- 'Vulkan.Core10.Enums.QueryControlFlagBits.QueryControlFlagBits'
                           -- specifying constraints on the types of queries that /can/ be performed.
                           QueryControlFlags
                        -> -- | @index@ is the query type specific index. When the query type is
                           -- 'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT'
                           -- the index represents the vertex stream.
                           ("index" ::: Word32)
                        -> io ()
cmdBeginQueryIndexedEXT :: CommandBuffer
-> QueryPool
-> ("firstBinding" ::: Word32)
-> QueryControlFlags
-> ("firstBinding" ::: Word32)
-> io ()
cmdBeginQueryIndexedEXT commandBuffer :: CommandBuffer
commandBuffer queryPool :: QueryPool
queryPool query :: "firstBinding" ::: Word32
query flags :: QueryControlFlags
flags index :: "firstBinding" ::: Word32
index = IO () -> io ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ()) -> IO () -> io ()
forall a b. (a -> b) -> a -> b
$ do
  let vkCmdBeginQueryIndexedEXTPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> QueryPool
   -> ("firstBinding" ::: Word32)
   -> QueryControlFlags
   -> ("firstBinding" ::: Word32)
   -> IO ())
vkCmdBeginQueryIndexedEXTPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> QueryPool
      -> ("firstBinding" ::: Word32)
      -> QueryControlFlags
      -> ("firstBinding" ::: Word32)
      -> IO ())
pVkCmdBeginQueryIndexedEXT (CommandBuffer -> DeviceCmds
deviceCmds (CommandBuffer
commandBuffer :: CommandBuffer))
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr CommandBuffer_T
   -> QueryPool
   -> ("firstBinding" ::: Word32)
   -> QueryControlFlags
   -> ("firstBinding" ::: Word32)
   -> IO ())
vkCmdBeginQueryIndexedEXTPtr FunPtr
  (Ptr CommandBuffer_T
   -> QueryPool
   -> ("firstBinding" ::: Word32)
   -> QueryControlFlags
   -> ("firstBinding" ::: Word32)
   -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> QueryPool
      -> ("firstBinding" ::: Word32)
      -> QueryControlFlags
      -> ("firstBinding" ::: Word32)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> QueryPool
   -> ("firstBinding" ::: Word32)
   -> QueryControlFlags
   -> ("firstBinding" ::: Word32)
   -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "The function pointer for vkCmdBeginQueryIndexedEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdBeginQueryIndexedEXT' :: Ptr CommandBuffer_T
-> QueryPool
-> ("firstBinding" ::: Word32)
-> QueryControlFlags
-> ("firstBinding" ::: Word32)
-> IO ()
vkCmdBeginQueryIndexedEXT' = FunPtr
  (Ptr CommandBuffer_T
   -> QueryPool
   -> ("firstBinding" ::: Word32)
   -> QueryControlFlags
   -> ("firstBinding" ::: Word32)
   -> IO ())
-> Ptr CommandBuffer_T
-> QueryPool
-> ("firstBinding" ::: Word32)
-> QueryControlFlags
-> ("firstBinding" ::: Word32)
-> IO ()
mkVkCmdBeginQueryIndexedEXT FunPtr
  (Ptr CommandBuffer_T
   -> QueryPool
   -> ("firstBinding" ::: Word32)
   -> QueryControlFlags
   -> ("firstBinding" ::: Word32)
   -> IO ())
vkCmdBeginQueryIndexedEXTPtr
  Ptr CommandBuffer_T
-> QueryPool
-> ("firstBinding" ::: Word32)
-> QueryControlFlags
-> ("firstBinding" ::: Word32)
-> IO ()
vkCmdBeginQueryIndexedEXT' (CommandBuffer -> Ptr CommandBuffer_T
commandBufferHandle (CommandBuffer
commandBuffer)) (QueryPool
queryPool) ("firstBinding" ::: Word32
query) (QueryControlFlags
flags) ("firstBinding" ::: Word32
index)
  () -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> IO ()) -> () -> IO ()
forall a b. (a -> b) -> a -> b
$ ()

-- | This function will call the supplied action between calls to
-- 'cmdBeginQueryIndexedEXT' and 'cmdEndQueryIndexedEXT'
--
-- Note that 'cmdEndQueryIndexedEXT' is *not* called if an exception is
-- thrown by the inner action.
cmdUseQueryIndexedEXT :: forall io r . MonadIO io => CommandBuffer -> QueryPool -> Word32 -> QueryControlFlags -> Word32 -> io r -> io r
cmdUseQueryIndexedEXT :: CommandBuffer
-> QueryPool
-> ("firstBinding" ::: Word32)
-> QueryControlFlags
-> ("firstBinding" ::: Word32)
-> io r
-> io r
cmdUseQueryIndexedEXT commandBuffer :: CommandBuffer
commandBuffer queryPool :: QueryPool
queryPool query :: "firstBinding" ::: Word32
query flags :: QueryControlFlags
flags index :: "firstBinding" ::: Word32
index a :: io r
a =
  (CommandBuffer
-> QueryPool
-> ("firstBinding" ::: Word32)
-> QueryControlFlags
-> ("firstBinding" ::: Word32)
-> io ()
forall (io :: * -> *).
MonadIO io =>
CommandBuffer
-> QueryPool
-> ("firstBinding" ::: Word32)
-> QueryControlFlags
-> ("firstBinding" ::: Word32)
-> io ()
cmdBeginQueryIndexedEXT CommandBuffer
commandBuffer QueryPool
queryPool "firstBinding" ::: Word32
query QueryControlFlags
flags "firstBinding" ::: Word32
index) io () -> io r -> io r
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> io r
a io r -> io () -> io r
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* (CommandBuffer
-> QueryPool
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> io ()
forall (io :: * -> *).
MonadIO io =>
CommandBuffer
-> QueryPool
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> io ()
cmdEndQueryIndexedEXT CommandBuffer
commandBuffer QueryPool
queryPool "firstBinding" ::: Word32
query "firstBinding" ::: Word32
index)


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

-- | vkCmdEndQueryIndexedEXT - Ends a query
--
-- = Description
--
-- The 'cmdEndQueryIndexedEXT' command operates the same as the
-- 'Vulkan.Core10.CommandBufferBuilding.cmdEndQuery' command, except that
-- it also accepts a query type specific @index@ parameter.
--
-- == Valid Usage
--
-- -   All queries used by the command /must/ be
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#queries-operation-active active>
--
-- -   @query@ /must/ be less than the number of queries in @queryPool@
--
-- -   @commandBuffer@ /must/ not be a protected command buffer
--
-- -   If 'cmdEndQueryIndexedEXT' is called within a render pass instance,
--     the sum of @query@ and the number of bits set in the current
--     subpass’s view mask /must/ be less than or equal to the number of
--     queries in @queryPool@
--
-- -   If the @queryType@ used to create @queryPool@ was
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT'
--     the @index@ parameter /must/ be less than
--     'PhysicalDeviceTransformFeedbackPropertiesEXT'::@maxTransformFeedbackStreams@
--
-- -   If the @queryType@ used to create @queryPool@ was not
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT'
--     the @index@ /must/ be zero
--
-- -   If the @queryType@ used to create @queryPool@ was
--     'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT'
--     @index@ /must/ equal the @index@ used to begin the query
--
-- == Valid Usage (Implicit)
--
-- -   @commandBuffer@ /must/ be a valid
--     'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   @queryPool@ /must/ be a valid 'Vulkan.Core10.Handles.QueryPool'
--     handle
--
-- -   @commandBuffer@ /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   The 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics, or compute operations
--
-- -   Both of @commandBuffer@, and @queryPool@ /must/ have been created,
--     allocated, or retrieved from the same 'Vulkan.Core10.Handles.Device'
--
-- == 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#VkQueueFlagBits Supported Queue Types> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#synchronization-pipeline-stages-types Pipeline Type> |
-- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+=====================================================================================================================================+
-- | Primary                                                                                                                    | Both                                                                                                                   | Graphics                                                                                                              |                                                                                                                                     |
-- | Secondary                                                                                                                  |                                                                                                                        | Compute                                                                                                               |                                                                                                                                     |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.CommandBuffer', 'Vulkan.Core10.Handles.QueryPool'
cmdEndQueryIndexedEXT :: forall io
                       . (MonadIO io)
                      => -- | @commandBuffer@ is the command buffer into which this command will be
                         -- recorded.
                         CommandBuffer
                      -> -- | @queryPool@ is the query pool that is managing the results of the query.
                         QueryPool
                      -> -- | @query@ is the query index within the query pool where the result is
                         -- stored.
                         ("query" ::: Word32)
                      -> -- | @index@ is the query type specific index.
                         ("index" ::: Word32)
                      -> io ()
cmdEndQueryIndexedEXT :: CommandBuffer
-> QueryPool
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> io ()
cmdEndQueryIndexedEXT commandBuffer :: CommandBuffer
commandBuffer queryPool :: QueryPool
queryPool query :: "firstBinding" ::: Word32
query index :: "firstBinding" ::: Word32
index = IO () -> io ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ()) -> IO () -> io ()
forall a b. (a -> b) -> a -> b
$ do
  let vkCmdEndQueryIndexedEXTPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> QueryPool
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> IO ())
vkCmdEndQueryIndexedEXTPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> QueryPool
      -> ("firstBinding" ::: Word32)
      -> ("firstBinding" ::: Word32)
      -> IO ())
pVkCmdEndQueryIndexedEXT (CommandBuffer -> DeviceCmds
deviceCmds (CommandBuffer
commandBuffer :: CommandBuffer))
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr CommandBuffer_T
   -> QueryPool
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> IO ())
vkCmdEndQueryIndexedEXTPtr FunPtr
  (Ptr CommandBuffer_T
   -> QueryPool
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> QueryPool
      -> ("firstBinding" ::: Word32)
      -> ("firstBinding" ::: Word32)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> QueryPool
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "The function pointer for vkCmdEndQueryIndexedEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdEndQueryIndexedEXT' :: Ptr CommandBuffer_T
-> QueryPool
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> IO ()
vkCmdEndQueryIndexedEXT' = FunPtr
  (Ptr CommandBuffer_T
   -> QueryPool
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> IO ())
-> Ptr CommandBuffer_T
-> QueryPool
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> IO ()
mkVkCmdEndQueryIndexedEXT FunPtr
  (Ptr CommandBuffer_T
   -> QueryPool
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> IO ())
vkCmdEndQueryIndexedEXTPtr
  Ptr CommandBuffer_T
-> QueryPool
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> IO ()
vkCmdEndQueryIndexedEXT' (CommandBuffer -> Ptr CommandBuffer_T
commandBufferHandle (CommandBuffer
commandBuffer)) (QueryPool
queryPool) ("firstBinding" ::: Word32
query) ("firstBinding" ::: Word32
index)
  () -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> IO ()) -> () -> IO ()
forall a b. (a -> b) -> a -> b
$ ()


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCmdDrawIndirectByteCountEXT
  :: FunPtr (Ptr CommandBuffer_T -> Word32 -> Word32 -> Buffer -> DeviceSize -> Word32 -> Word32 -> IO ()) -> Ptr CommandBuffer_T -> Word32 -> Word32 -> Buffer -> DeviceSize -> Word32 -> Word32 -> IO ()

-- | vkCmdDrawIndirectByteCountEXT - Draw primitives where the vertex count
-- is derived from the counter byte value in the counter buffer
--
-- = Description
--
-- When the command is executed, primitives are assembled in the same way
-- as done with 'Vulkan.Core10.CommandBufferBuilding.cmdDraw' except the
-- @vertexCount@ is calculated based on the byte count read from
-- @counterBuffer@ at offset @counterBufferOffset@. The assembled
-- primitives execute the bound graphics pipeline.
--
-- The effective @vertexCount@ is calculated as follows:
--
-- > const uint32_t * counterBufferPtr = (const uint8_t *)counterBuffer.address + counterBufferOffset;
-- > vertexCount = floor(max(0, (*counterBufferPtr - counterOffset)) / vertexStride);
--
-- The effective @firstVertex@ is zero.
--
-- == Valid Usage
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is sampled with
--     'Vulkan.Core10.Enums.Filter.FILTER_LINEAR' as a result of this
--     command, then the image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     /must/ contain
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT'
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is accessed using atomic
--     operations as a result of this command, then the image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     /must/ contain
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT'
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is sampled with
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' as a result
--     of this command, then the image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     /must/ contain
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT'
--
-- -   Any 'Vulkan.Core10.Handles.ImageView' being sampled with
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' as a result
--     of this command /must/ have a
--     'Vulkan.Core10.Enums.ImageViewType.ImageViewType' and format that
--     supports cubic filtering, as specified by
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FilterCubicImageViewImageFormatPropertiesEXT'::@filterCubic@
--     returned by
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2'
--
-- -   Any 'Vulkan.Core10.Handles.ImageView' being sampled with
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' with a
--     reduction mode of either
--     'Vulkan.Core12.Enums.SamplerReductionMode.SAMPLER_REDUCTION_MODE_MIN'
--     or
--     'Vulkan.Core12.Enums.SamplerReductionMode.SAMPLER_REDUCTION_MODE_MAX'
--     as a result of this command /must/ have a
--     'Vulkan.Core10.Enums.ImageViewType.ImageViewType' and format that
--     supports cubic filtering together with minmax filtering, as
--     specified by
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FilterCubicImageViewImageFormatPropertiesEXT'::@filterCubicMinmax@
--     returned by
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2'
--
-- -   Any 'Vulkan.Core10.Handles.Image' created with a
--     'Vulkan.Core10.Image.ImageCreateInfo'::@flags@ containing
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CORNER_SAMPLED_BIT_NV'
--     sampled as a result of this command /must/ only be sampled using a
--     'Vulkan.Core10.Enums.SamplerAddressMode.SamplerAddressMode' of
--     'Vulkan.Core10.Enums.SamplerAddressMode.SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE'
--
-- -   For each set /n/ that is statically used by the
--     'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind point
--     used by this command, a descriptor set /must/ have been bound to /n/
--     at the same pipeline bind point, with a
--     'Vulkan.Core10.Handles.PipelineLayout' that is compatible for set
--     /n/, with the 'Vulkan.Core10.Handles.PipelineLayout' used to create
--     the current 'Vulkan.Core10.Handles.Pipeline', as described in
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorsets-compatibility ???>
--
-- -   For each push constant that is statically used by the
--     'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind point
--     used by this command, a push constant value /must/ have been set for
--     the same pipeline bind point, with a
--     'Vulkan.Core10.Handles.PipelineLayout' that is compatible for push
--     constants, with the 'Vulkan.Core10.Handles.PipelineLayout' used to
--     create the current 'Vulkan.Core10.Handles.Pipeline', as described in
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorsets-compatibility ???>
--
-- -   Descriptors in each bound descriptor set, specified via
--     'Vulkan.Core10.CommandBufferBuilding.cmdBindDescriptorSets', /must/
--     be valid if they are statically used by the
--     'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind point
--     used by this command
--
-- -   A valid pipeline /must/ be bound to the pipeline bind point used by
--     this command
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command requires any dynamic state, that
--     state /must/ have been set for @commandBuffer@, and done so after
--     any previously bound pipeline with the corresponding state not
--     specified as dynamic
--
-- -   There /must/ not have been any calls to dynamic state setting
--     commands for any state not specified as dynamic in the
--     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
--     point used by this command, since that pipeline was bound
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command accesses a
--     'Vulkan.Core10.Handles.Sampler' object that uses unnormalized
--     coordinates, that sampler /must/ not be used to sample from any
--     'Vulkan.Core10.Handles.Image' with a
--     'Vulkan.Core10.Handles.ImageView' of the type
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_3D',
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_CUBE',
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_1D_ARRAY',
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_2D_ARRAY' or
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_CUBE_ARRAY', in
--     any shader stage
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command accesses a
--     'Vulkan.Core10.Handles.Sampler' object that uses unnormalized
--     coordinates, that sampler /must/ not be used with any of the SPIR-V
--     @OpImageSample*@ or @OpImageSparseSample*@ instructions with
--     @ImplicitLod@, @Dref@ or @Proj@ in their name, in any shader stage
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command accesses a
--     'Vulkan.Core10.Handles.Sampler' object that uses unnormalized
--     coordinates, that sampler /must/ not be used with any of the SPIR-V
--     @OpImageSample*@ or @OpImageSparseSample*@ instructions that
--     includes a LOD bias or any offset values, in any shader stage
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-robustBufferAccess robust buffer access>
--     feature is not enabled, and if the 'Vulkan.Core10.Handles.Pipeline'
--     object bound to the pipeline bind point used by this command
--     accesses a uniform buffer, it /must/ not access values outside of
--     the range of the buffer as specified in the descriptor set bound to
--     the same pipeline bind point
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-robustBufferAccess robust buffer access>
--     feature is not enabled, and if the 'Vulkan.Core10.Handles.Pipeline'
--     object bound to the pipeline bind point used by this command
--     accesses a storage buffer, it /must/ not access values outside of
--     the range of the buffer as specified in the descriptor set bound to
--     the same pipeline bind point
--
-- -   If @commandBuffer@ is an unprotected command buffer, any resource
--     accessed by the 'Vulkan.Core10.Handles.Pipeline' object bound to the
--     pipeline bind point used by this command /must/ not be a protected
--     resource
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is accessed using
--     @OpImageWrite@ as a result of this command, then the @Type@ of the
--     @Texel@ operand of that instruction /must/ have at least as many
--     components as the image view’s format.
--
-- -   The current render pass /must/ be
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#renderpass-compatibility compatible>
--     with the @renderPass@ member of the
--     'Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo' structure
--     specified when creating the 'Vulkan.Core10.Handles.Pipeline' bound
--     to
--     'Vulkan.Core10.Enums.PipelineBindPoint.PIPELINE_BIND_POINT_GRAPHICS'
--
-- -   The subpass index of the current render pass /must/ be equal to the
--     @subpass@ member of the
--     'Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo' structure
--     specified when creating the 'Vulkan.Core10.Handles.Pipeline' bound
--     to
--     'Vulkan.Core10.Enums.PipelineBindPoint.PIPELINE_BIND_POINT_GRAPHICS'
--
-- -   Every input attachment used by the current subpass /must/ be bound
--     to the pipeline via a descriptor set
--
-- -   Image subresources used as attachments in the current render pass
--     /must/ not be accessed in any way other than as an attachment by
--     this command
--
-- -   If the draw is recorded in a render pass instance with multiview
--     enabled, the maximum instance index /must/ be less than or equal to
--     'Vulkan.Core11.Promoted_From_VK_KHR_multiview.PhysicalDeviceMultiviewProperties'::@maxMultiviewInstanceIndex@
--
-- -   If the bound graphics pipeline was created with
--     'Vulkan.Extensions.VK_EXT_sample_locations.PipelineSampleLocationsStateCreateInfoEXT'::@sampleLocationsEnable@
--     set to 'Vulkan.Core10.FundamentalTypes.TRUE' and the current subpass
--     has a depth\/stencil attachment, then that attachment /must/ have
--     been created with the
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT'
--     bit set
--
-- -   If the bound graphics pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     dynamic state enabled, but not the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT'
--     dynamic state enabled, then then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--     /must/ have been called in the current command buffer prior to this
--     draw command, and the @viewportCount@ parameter of
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--     /must/ match the
--     'Vulkan.Core10.Pipeline.PipelineViewportStateCreateInfo'::@scissorCount@
--     of the pipeline
--
-- -   If the bound graphics pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT'
--     dynamic state enabled, but not the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     dynamic state enabled, then then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetScissorWithCountEXT'
--     /must/ have been called in the current command buffer prior to this
--     draw command, and the @scissorCount@ parameter of
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetScissorWithCountEXT'
--     /must/ match the
--     'Vulkan.Core10.Pipeline.PipelineViewportStateCreateInfo'::@viewportCount@
--     of the pipeline
--
-- -   If the bound graphics pipeline state was created with both the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT'
--     and
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     dynamic states enabled then both
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--     and
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetScissorWithCountEXT'
--     /must/ have been called in the current command buffer prior to this
--     draw command, and the @viewportCount@ parameter of
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--     /must/ match the @scissorCount@ parameter of
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetScissorWithCountEXT'
--
-- -   If the bound graphics pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT'
--     dynamic state enabled then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetPrimitiveTopologyEXT'
--     /must/ have been called in the current command buffer prior to this
--     draw command, and the @primitiveTopology@ parameter of
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetPrimitiveTopologyEXT'
--     /must/ be of the same
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#drawing-primitive-topology-class topology class>
--     as the pipeline
--     'Vulkan.Core10.Pipeline.PipelineInputAssemblyStateCreateInfo'::@topology@
--     state
--
-- -   All vertex input bindings accessed via vertex input variables
--     declared in the vertex shader entry point’s interface /must/ have
--     either valid or 'Vulkan.Core10.APIConstants.NULL_HANDLE' buffers
--     bound
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-nullDescriptor nullDescriptor>
--     feature is not enabled, all vertex input bindings accessed via
--     vertex input variables declared in the vertex shader entry point’s
--     interface /must/ not be 'Vulkan.Core10.APIConstants.NULL_HANDLE'
--
-- -   For a given vertex buffer binding, any attribute data fetched /must/
--     be entirely contained within the corresponding vertex buffer
--     binding, as described in
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fxvertex-input ???>
--
-- -   'PhysicalDeviceTransformFeedbackFeaturesEXT'::@transformFeedback@
--     /must/ be enabled
--
-- -   The implementation /must/ support
--     'PhysicalDeviceTransformFeedbackPropertiesEXT'::@transformFeedbackDraw@
--
-- -   @vertexStride@ /must/ be greater than 0 and less than or equal to
--     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxTransformFeedbackBufferDataStride@
--
-- -   @counterBuffer@ /must/ have been created with the
--     'Vulkan.Core10.Enums.BufferUsageFlagBits.BUFFER_USAGE_INDIRECT_BUFFER_BIT'
--     bit set
--
-- -   @commandBuffer@ /must/ not be a protected command buffer
--
-- == Valid Usage (Implicit)
--
-- -   @commandBuffer@ /must/ be a valid
--     'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   @counterBuffer@ /must/ be a valid 'Vulkan.Core10.Handles.Buffer'
--     handle
--
-- -   @commandBuffer@ /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   The 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   This command /must/ only be called inside of a render pass instance
--
-- -   Both of @commandBuffer@, and @counterBuffer@ /must/ have been
--     created, allocated, or retrieved from the same
--     'Vulkan.Core10.Handles.Device'
--
-- == 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#VkQueueFlagBits Supported Queue Types> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#synchronization-pipeline-stages-types Pipeline Type> |
-- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+=====================================================================================================================================+
-- | Primary                                                                                                                    | Inside                                                                                                                 | Graphics                                                                                                              | Graphics                                                                                                                            |
-- | Secondary                                                                                                                  |                                                                                                                        |                                                                                                                       |                                                                                                                                     |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.Buffer', 'Vulkan.Core10.Handles.CommandBuffer',
-- 'Vulkan.Core10.FundamentalTypes.DeviceSize'
cmdDrawIndirectByteCountEXT :: forall io
                             . (MonadIO io)
                            => -- | @commandBuffer@ is the command buffer into which the command is
                               -- recorded.
                               CommandBuffer
                            -> -- | @instanceCount@ is the number of instances to draw.
                               ("instanceCount" ::: Word32)
                            -> -- | @firstInstance@ is the instance ID of the first instance to draw.
                               ("firstInstance" ::: Word32)
                            -> -- | @counterBuffer@ is the buffer handle from where the byte count is read.
                               ("counterBuffer" ::: Buffer)
                            -> -- | @counterBufferOffset@ is the offset into the buffer used to read the
                               -- byte count, which is used to calculate the vertex count for this draw
                               -- call.
                               ("counterBufferOffset" ::: DeviceSize)
                            -> -- | @counterOffset@ is subtracted from the byte count read from the
                               -- @counterBuffer@ at the @counterBufferOffset@
                               ("counterOffset" ::: Word32)
                            -> -- | @vertexStride@ is the stride in bytes between each element of the vertex
                               -- data that is used to calculate the vertex count from the counter value.
                               -- This value is typically the same value that was used in the graphics
                               -- pipeline state when the transform feedback was captured as the
                               -- @XfbStride@.
                               ("vertexStride" ::: Word32)
                            -> io ()
cmdDrawIndirectByteCountEXT :: CommandBuffer
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> Buffer
-> DeviceSize
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> io ()
cmdDrawIndirectByteCountEXT commandBuffer :: CommandBuffer
commandBuffer instanceCount :: "firstBinding" ::: Word32
instanceCount firstInstance :: "firstBinding" ::: Word32
firstInstance counterBuffer :: Buffer
counterBuffer counterBufferOffset :: DeviceSize
counterBufferOffset counterOffset :: "firstBinding" ::: Word32
counterOffset vertexStride :: "firstBinding" ::: Word32
vertexStride = IO () -> io ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ()) -> IO () -> io ()
forall a b. (a -> b) -> a -> b
$ do
  let vkCmdDrawIndirectByteCountEXTPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> Buffer
   -> DeviceSize
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> IO ())
vkCmdDrawIndirectByteCountEXTPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("firstBinding" ::: Word32)
      -> ("firstBinding" ::: Word32)
      -> Buffer
      -> DeviceSize
      -> ("firstBinding" ::: Word32)
      -> ("firstBinding" ::: Word32)
      -> IO ())
pVkCmdDrawIndirectByteCountEXT (CommandBuffer -> DeviceCmds
deviceCmds (CommandBuffer
commandBuffer :: CommandBuffer))
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> Buffer
   -> DeviceSize
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> IO ())
vkCmdDrawIndirectByteCountEXTPtr FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> Buffer
   -> DeviceSize
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("firstBinding" ::: Word32)
      -> ("firstBinding" ::: Word32)
      -> Buffer
      -> DeviceSize
      -> ("firstBinding" ::: Word32)
      -> ("firstBinding" ::: Word32)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> Buffer
   -> DeviceSize
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "The function pointer for vkCmdDrawIndirectByteCountEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdDrawIndirectByteCountEXT' :: Ptr CommandBuffer_T
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> Buffer
-> DeviceSize
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> IO ()
vkCmdDrawIndirectByteCountEXT' = FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> Buffer
   -> DeviceSize
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> IO ())
-> Ptr CommandBuffer_T
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> Buffer
-> DeviceSize
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> IO ()
mkVkCmdDrawIndirectByteCountEXT FunPtr
  (Ptr CommandBuffer_T
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> Buffer
   -> DeviceSize
   -> ("firstBinding" ::: Word32)
   -> ("firstBinding" ::: Word32)
   -> IO ())
vkCmdDrawIndirectByteCountEXTPtr
  Ptr CommandBuffer_T
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> Buffer
-> DeviceSize
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> IO ()
vkCmdDrawIndirectByteCountEXT' (CommandBuffer -> Ptr CommandBuffer_T
commandBufferHandle (CommandBuffer
commandBuffer)) ("firstBinding" ::: Word32
instanceCount) ("firstBinding" ::: Word32
firstInstance) (Buffer
counterBuffer) (DeviceSize
counterBufferOffset) ("firstBinding" ::: Word32
counterOffset) ("firstBinding" ::: Word32
vertexStride)
  () -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> IO ()) -> () -> IO ()
forall a b. (a -> b) -> a -> b
$ ()


-- | VkPhysicalDeviceTransformFeedbackFeaturesEXT - Structure describing
-- transform feedback features that can be supported by an implementation
--
-- = Members
--
-- The members of the 'PhysicalDeviceTransformFeedbackFeaturesEXT'
-- structure describe the following features:
--
-- = Description
--
-- If the 'PhysicalDeviceTransformFeedbackFeaturesEXT' structure is
-- included in the @pNext@ chain of
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
-- it is filled with values indicating whether each feature is supported.
-- 'PhysicalDeviceTransformFeedbackFeaturesEXT' /can/ also be included in
-- the @pNext@ chain of 'Vulkan.Core10.Device.DeviceCreateInfo' to enable
-- features.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceTransformFeedbackFeaturesEXT = PhysicalDeviceTransformFeedbackFeaturesEXT
  { -- | @transformFeedback@ indicates whether the implementation supports
    -- transform feedback and shader modules /can/ declare the
    -- @TransformFeedback@ capability.
    PhysicalDeviceTransformFeedbackFeaturesEXT -> Bool
transformFeedback :: Bool
  , -- | @geometryStreams@ indicates whether the implementation supports the
    -- @GeometryStreams@ SPIR-V capability.
    PhysicalDeviceTransformFeedbackFeaturesEXT -> Bool
geometryStreams :: Bool
  }
  deriving (Typeable, PhysicalDeviceTransformFeedbackFeaturesEXT
-> PhysicalDeviceTransformFeedbackFeaturesEXT -> Bool
(PhysicalDeviceTransformFeedbackFeaturesEXT
 -> PhysicalDeviceTransformFeedbackFeaturesEXT -> Bool)
-> (PhysicalDeviceTransformFeedbackFeaturesEXT
    -> PhysicalDeviceTransformFeedbackFeaturesEXT -> Bool)
-> Eq PhysicalDeviceTransformFeedbackFeaturesEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PhysicalDeviceTransformFeedbackFeaturesEXT
-> PhysicalDeviceTransformFeedbackFeaturesEXT -> Bool
$c/= :: PhysicalDeviceTransformFeedbackFeaturesEXT
-> PhysicalDeviceTransformFeedbackFeaturesEXT -> Bool
== :: PhysicalDeviceTransformFeedbackFeaturesEXT
-> PhysicalDeviceTransformFeedbackFeaturesEXT -> Bool
$c== :: PhysicalDeviceTransformFeedbackFeaturesEXT
-> PhysicalDeviceTransformFeedbackFeaturesEXT -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceTransformFeedbackFeaturesEXT)
#endif
deriving instance Show PhysicalDeviceTransformFeedbackFeaturesEXT

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

instance FromCStruct PhysicalDeviceTransformFeedbackFeaturesEXT where
  peekCStruct :: Ptr PhysicalDeviceTransformFeedbackFeaturesEXT
-> IO PhysicalDeviceTransformFeedbackFeaturesEXT
peekCStruct p :: Ptr PhysicalDeviceTransformFeedbackFeaturesEXT
p = do
    Bool32
transformFeedback <- Ptr Bool32 -> IO Bool32
forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr PhysicalDeviceTransformFeedbackFeaturesEXT
p Ptr PhysicalDeviceTransformFeedbackFeaturesEXT -> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr Bool32))
    Bool32
geometryStreams <- Ptr Bool32 -> IO Bool32
forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr PhysicalDeviceTransformFeedbackFeaturesEXT
p Ptr PhysicalDeviceTransformFeedbackFeaturesEXT -> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 20 :: Ptr Bool32))
    PhysicalDeviceTransformFeedbackFeaturesEXT
-> IO PhysicalDeviceTransformFeedbackFeaturesEXT
forall (f :: * -> *) a. Applicative f => a -> f a
pure (PhysicalDeviceTransformFeedbackFeaturesEXT
 -> IO PhysicalDeviceTransformFeedbackFeaturesEXT)
-> PhysicalDeviceTransformFeedbackFeaturesEXT
-> IO PhysicalDeviceTransformFeedbackFeaturesEXT
forall a b. (a -> b) -> a -> b
$ Bool -> Bool -> PhysicalDeviceTransformFeedbackFeaturesEXT
PhysicalDeviceTransformFeedbackFeaturesEXT
             (Bool32 -> Bool
bool32ToBool Bool32
transformFeedback) (Bool32 -> Bool
bool32ToBool Bool32
geometryStreams)

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

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


-- | VkPhysicalDeviceTransformFeedbackPropertiesEXT - Structure describing
-- transform feedback properties that can be supported by an implementation
--
-- = Members
--
-- The members of the 'PhysicalDeviceTransformFeedbackPropertiesEXT'
-- structure describe the following implementation-dependent limits:
--
-- = Description
--
-- If the 'PhysicalDeviceTransformFeedbackPropertiesEXT' structure is
-- included in the @pNext@ chain of
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2',
-- it is filled with the implementation-dependent limits and properties.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.FundamentalTypes.DeviceSize',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceTransformFeedbackPropertiesEXT = PhysicalDeviceTransformFeedbackPropertiesEXT
  { -- | @maxTransformFeedbackStreams@ is the maximum number of vertex streams
    -- that can be output from geometry shaders declared with the
    -- @GeometryStreams@ capability. If the implementation does not support
    -- 'PhysicalDeviceTransformFeedbackFeaturesEXT'::@geometryStreams@ then
    -- @maxTransformFeedbackStreams@ /must/ be set to @1@.
    PhysicalDeviceTransformFeedbackPropertiesEXT
-> "firstBinding" ::: Word32
maxTransformFeedbackStreams :: Word32
  , -- | @maxTransformFeedbackBuffers@ is the maximum number of transform
    -- feedback buffers that can be bound for capturing shader outputs from the
    -- last vertex processing stage.
    PhysicalDeviceTransformFeedbackPropertiesEXT
-> "firstBinding" ::: Word32
maxTransformFeedbackBuffers :: Word32
  , -- | @maxTransformFeedbackBufferSize@ is the maximum size that can be
    -- specified when binding a buffer for transform feedback in
    -- 'cmdBindTransformFeedbackBuffersEXT'.
    PhysicalDeviceTransformFeedbackPropertiesEXT -> DeviceSize
maxTransformFeedbackBufferSize :: DeviceSize
  , -- | @maxTransformFeedbackStreamDataSize@ is the maximum amount of data in
    -- bytes for each vertex that captured to one or more transform feedback
    -- buffers associated with a specific vertex stream.
    PhysicalDeviceTransformFeedbackPropertiesEXT
-> "firstBinding" ::: Word32
maxTransformFeedbackStreamDataSize :: Word32
  , -- | @maxTransformFeedbackBufferDataSize@ is the maximum amount of data in
    -- bytes for each vertex that can be captured to a specific transform
    -- feedback buffer.
    PhysicalDeviceTransformFeedbackPropertiesEXT
-> "firstBinding" ::: Word32
maxTransformFeedbackBufferDataSize :: Word32
  , -- | @maxTransformFeedbackBufferDataStride@ is the maximum stride between
    -- each capture of vertex data to the buffer.
    PhysicalDeviceTransformFeedbackPropertiesEXT
-> "firstBinding" ::: Word32
maxTransformFeedbackBufferDataStride :: Word32
  , -- | @transformFeedbackQueries@ is true if the implementation supports the
    -- 'Vulkan.Core10.Enums.QueryType.QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT'
    -- query type. @transformFeedbackQueries@ is false if queries of this type
    -- /cannot/ be created.
    PhysicalDeviceTransformFeedbackPropertiesEXT -> Bool
transformFeedbackQueries :: Bool
  , -- | @transformFeedbackStreamsLinesTriangles@ is true if the implementation
    -- supports the geometry shader @OpExecutionMode@ of @OutputLineStrip@ and
    -- @OutputTriangleStrip@ in addition to @OutputPoints@ when more than one
    -- vertex stream is output. If @transformFeedbackStreamsLinesTriangles@ is
    -- false the implementation only supports an @OpExecutionMode@ of
    -- @OutputPoints@ when more than one vertex stream is output from the
    -- geometry shader.
    PhysicalDeviceTransformFeedbackPropertiesEXT -> Bool
transformFeedbackStreamsLinesTriangles :: Bool
  , -- | @transformFeedbackRasterizationStreamSelect@ is true if the
    -- implementation supports the @GeometryStreams@ SPIR-V capability and the
    -- application can use 'PipelineRasterizationStateStreamCreateInfoEXT' to
    -- modify which vertex stream output is used for rasterization. Otherwise
    -- vertex stream @0@ /must/ always be used for rasterization.
    PhysicalDeviceTransformFeedbackPropertiesEXT -> Bool
transformFeedbackRasterizationStreamSelect :: Bool
  , -- | @transformFeedbackDraw@ is true if the implementation supports the
    -- 'cmdDrawIndirectByteCountEXT' function otherwise the function /must/ not
    -- be called.
    PhysicalDeviceTransformFeedbackPropertiesEXT -> Bool
transformFeedbackDraw :: Bool
  }
  deriving (Typeable, PhysicalDeviceTransformFeedbackPropertiesEXT
-> PhysicalDeviceTransformFeedbackPropertiesEXT -> Bool
(PhysicalDeviceTransformFeedbackPropertiesEXT
 -> PhysicalDeviceTransformFeedbackPropertiesEXT -> Bool)
-> (PhysicalDeviceTransformFeedbackPropertiesEXT
    -> PhysicalDeviceTransformFeedbackPropertiesEXT -> Bool)
-> Eq PhysicalDeviceTransformFeedbackPropertiesEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PhysicalDeviceTransformFeedbackPropertiesEXT
-> PhysicalDeviceTransformFeedbackPropertiesEXT -> Bool
$c/= :: PhysicalDeviceTransformFeedbackPropertiesEXT
-> PhysicalDeviceTransformFeedbackPropertiesEXT -> Bool
== :: PhysicalDeviceTransformFeedbackPropertiesEXT
-> PhysicalDeviceTransformFeedbackPropertiesEXT -> Bool
$c== :: PhysicalDeviceTransformFeedbackPropertiesEXT
-> PhysicalDeviceTransformFeedbackPropertiesEXT -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceTransformFeedbackPropertiesEXT)
#endif
deriving instance Show PhysicalDeviceTransformFeedbackPropertiesEXT

instance ToCStruct PhysicalDeviceTransformFeedbackPropertiesEXT where
  withCStruct :: PhysicalDeviceTransformFeedbackPropertiesEXT
-> (Ptr PhysicalDeviceTransformFeedbackPropertiesEXT -> IO b)
-> IO b
withCStruct x :: PhysicalDeviceTransformFeedbackPropertiesEXT
x f :: Ptr PhysicalDeviceTransformFeedbackPropertiesEXT -> IO b
f = Int
-> Int
-> (Ptr PhysicalDeviceTransformFeedbackPropertiesEXT -> IO b)
-> IO b
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned 64 8 ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT -> IO b)
 -> IO b)
-> (Ptr PhysicalDeviceTransformFeedbackPropertiesEXT -> IO b)
-> IO b
forall a b. (a -> b) -> a -> b
$ \p :: Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p -> Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> PhysicalDeviceTransformFeedbackPropertiesEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p PhysicalDeviceTransformFeedbackPropertiesEXT
x (Ptr PhysicalDeviceTransformFeedbackPropertiesEXT -> IO b
f Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p)
  pokeCStruct :: Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> PhysicalDeviceTransformFeedbackPropertiesEXT -> IO b -> IO b
pokeCStruct p :: Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p PhysicalDeviceTransformFeedbackPropertiesEXT{..} f :: IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr Word32)) ("firstBinding" ::: Word32
maxTransformFeedbackStreams)
    Ptr ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 20 :: Ptr Word32)) ("firstBinding" ::: Word32
maxTransformFeedbackBuffers)
    ("pOffsets" ::: Ptr DeviceSize) -> DeviceSize -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> "pOffsets" ::: Ptr DeviceSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 24 :: Ptr DeviceSize)) (DeviceSize
maxTransformFeedbackBufferSize)
    Ptr ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 32 :: Ptr Word32)) ("firstBinding" ::: Word32
maxTransformFeedbackStreamDataSize)
    Ptr ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 36 :: Ptr Word32)) ("firstBinding" ::: Word32
maxTransformFeedbackBufferDataSize)
    Ptr ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 40 :: Ptr Word32)) ("firstBinding" ::: Word32
maxTransformFeedbackBufferDataStride)
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 44 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
transformFeedbackQueries))
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 48 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
transformFeedbackStreamsLinesTriangles))
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 52 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
transformFeedbackRasterizationStreamSelect))
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 56 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
transformFeedbackDraw))
    IO b
f
  cStructSize :: Int
cStructSize = 64
  cStructAlignment :: Int
cStructAlignment = 8
  pokeZeroCStruct :: Ptr PhysicalDeviceTransformFeedbackPropertiesEXT -> IO b -> IO b
pokeZeroCStruct p :: Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p f :: IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr Word32)) ("firstBinding" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 20 :: Ptr Word32)) ("firstBinding" ::: Word32
forall a. Zero a => a
zero)
    ("pOffsets" ::: Ptr DeviceSize) -> DeviceSize -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> "pOffsets" ::: Ptr DeviceSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 24 :: Ptr DeviceSize)) (DeviceSize
forall a. Zero a => a
zero)
    Ptr ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 32 :: Ptr Word32)) ("firstBinding" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 36 :: Ptr Word32)) ("firstBinding" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 40 :: Ptr Word32)) ("firstBinding" ::: Word32
forall a. Zero a => a
zero)
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 44 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
forall a. Zero a => a
zero))
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 48 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
forall a. Zero a => a
zero))
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 52 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
forall a. Zero a => a
zero))
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 56 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
forall a. Zero a => a
zero))
    IO b
f

instance FromCStruct PhysicalDeviceTransformFeedbackPropertiesEXT where
  peekCStruct :: Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> IO PhysicalDeviceTransformFeedbackPropertiesEXT
peekCStruct p :: Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p = do
    "firstBinding" ::: Word32
maxTransformFeedbackStreams <- Ptr ("firstBinding" ::: Word32) -> IO ("firstBinding" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr Word32))
    "firstBinding" ::: Word32
maxTransformFeedbackBuffers <- Ptr ("firstBinding" ::: Word32) -> IO ("firstBinding" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 20 :: Ptr Word32))
    DeviceSize
maxTransformFeedbackBufferSize <- ("pOffsets" ::: Ptr DeviceSize) -> IO DeviceSize
forall a. Storable a => Ptr a -> IO a
peek @DeviceSize ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> "pOffsets" ::: Ptr DeviceSize
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 24 :: Ptr DeviceSize))
    "firstBinding" ::: Word32
maxTransformFeedbackStreamDataSize <- Ptr ("firstBinding" ::: Word32) -> IO ("firstBinding" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 32 :: Ptr Word32))
    "firstBinding" ::: Word32
maxTransformFeedbackBufferDataSize <- Ptr ("firstBinding" ::: Word32) -> IO ("firstBinding" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 36 :: Ptr Word32))
    "firstBinding" ::: Word32
maxTransformFeedbackBufferDataStride <- Ptr ("firstBinding" ::: Word32) -> IO ("firstBinding" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 40 :: Ptr Word32))
    Bool32
transformFeedbackQueries <- Ptr Bool32 -> IO Bool32
forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 44 :: Ptr Bool32))
    Bool32
transformFeedbackStreamsLinesTriangles <- Ptr Bool32 -> IO Bool32
forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 48 :: Ptr Bool32))
    Bool32
transformFeedbackRasterizationStreamSelect <- Ptr Bool32 -> IO Bool32
forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 52 :: Ptr Bool32))
    Bool32
transformFeedbackDraw <- Ptr Bool32 -> IO Bool32
forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
p Ptr PhysicalDeviceTransformFeedbackPropertiesEXT
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 56 :: Ptr Bool32))
    PhysicalDeviceTransformFeedbackPropertiesEXT
-> IO PhysicalDeviceTransformFeedbackPropertiesEXT
forall (f :: * -> *) a. Applicative f => a -> f a
pure (PhysicalDeviceTransformFeedbackPropertiesEXT
 -> IO PhysicalDeviceTransformFeedbackPropertiesEXT)
-> PhysicalDeviceTransformFeedbackPropertiesEXT
-> IO PhysicalDeviceTransformFeedbackPropertiesEXT
forall a b. (a -> b) -> a -> b
$ ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> DeviceSize
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> Bool
-> Bool
-> Bool
-> Bool
-> PhysicalDeviceTransformFeedbackPropertiesEXT
PhysicalDeviceTransformFeedbackPropertiesEXT
             "firstBinding" ::: Word32
maxTransformFeedbackStreams "firstBinding" ::: Word32
maxTransformFeedbackBuffers DeviceSize
maxTransformFeedbackBufferSize "firstBinding" ::: Word32
maxTransformFeedbackStreamDataSize "firstBinding" ::: Word32
maxTransformFeedbackBufferDataSize "firstBinding" ::: Word32
maxTransformFeedbackBufferDataStride (Bool32 -> Bool
bool32ToBool Bool32
transformFeedbackQueries) (Bool32 -> Bool
bool32ToBool Bool32
transformFeedbackStreamsLinesTriangles) (Bool32 -> Bool
bool32ToBool Bool32
transformFeedbackRasterizationStreamSelect) (Bool32 -> Bool
bool32ToBool Bool32
transformFeedbackDraw)

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

instance Zero PhysicalDeviceTransformFeedbackPropertiesEXT where
  zero :: PhysicalDeviceTransformFeedbackPropertiesEXT
zero = ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> DeviceSize
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32)
-> Bool
-> Bool
-> Bool
-> Bool
-> PhysicalDeviceTransformFeedbackPropertiesEXT
PhysicalDeviceTransformFeedbackPropertiesEXT
           "firstBinding" ::: Word32
forall a. Zero a => a
zero
           "firstBinding" ::: Word32
forall a. Zero a => a
zero
           DeviceSize
forall a. Zero a => a
zero
           "firstBinding" ::: Word32
forall a. Zero a => a
zero
           "firstBinding" ::: Word32
forall a. Zero a => a
zero
           "firstBinding" ::: Word32
forall a. Zero a => a
zero
           Bool
forall a. Zero a => a
zero
           Bool
forall a. Zero a => a
zero
           Bool
forall a. Zero a => a
zero
           Bool
forall a. Zero a => a
zero


-- | VkPipelineRasterizationStateStreamCreateInfoEXT - Structure defining the
-- geometry stream used for rasterization
--
-- = Description
--
-- If this structure is not present, @rasterizationStream@ is assumed to be
-- zero.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- 'PipelineRasterizationStateStreamCreateFlagsEXT',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PipelineRasterizationStateStreamCreateInfoEXT = PipelineRasterizationStateStreamCreateInfoEXT
  { -- | @flags@ is reserved for future use.
    --
    -- @flags@ /must/ be @0@
    PipelineRasterizationStateStreamCreateInfoEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
flags :: PipelineRasterizationStateStreamCreateFlagsEXT
  , -- | @rasterizationStream@ is the vertex stream selected for rasterization.
    --
    -- @rasterizationStream@ /must/ be less than
    -- 'PhysicalDeviceTransformFeedbackPropertiesEXT'::@maxTransformFeedbackStreams@
    --
    -- @rasterizationStream@ /must/ be zero if
    -- 'PhysicalDeviceTransformFeedbackPropertiesEXT'::@transformFeedbackRasterizationStreamSelect@
    -- is 'Vulkan.Core10.FundamentalTypes.FALSE'
    PipelineRasterizationStateStreamCreateInfoEXT
-> "firstBinding" ::: Word32
rasterizationStream :: Word32
  }
  deriving (Typeable, PipelineRasterizationStateStreamCreateInfoEXT
-> PipelineRasterizationStateStreamCreateInfoEXT -> Bool
(PipelineRasterizationStateStreamCreateInfoEXT
 -> PipelineRasterizationStateStreamCreateInfoEXT -> Bool)
-> (PipelineRasterizationStateStreamCreateInfoEXT
    -> PipelineRasterizationStateStreamCreateInfoEXT -> Bool)
-> Eq PipelineRasterizationStateStreamCreateInfoEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PipelineRasterizationStateStreamCreateInfoEXT
-> PipelineRasterizationStateStreamCreateInfoEXT -> Bool
$c/= :: PipelineRasterizationStateStreamCreateInfoEXT
-> PipelineRasterizationStateStreamCreateInfoEXT -> Bool
== :: PipelineRasterizationStateStreamCreateInfoEXT
-> PipelineRasterizationStateStreamCreateInfoEXT -> Bool
$c== :: PipelineRasterizationStateStreamCreateInfoEXT
-> PipelineRasterizationStateStreamCreateInfoEXT -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PipelineRasterizationStateStreamCreateInfoEXT)
#endif
deriving instance Show PipelineRasterizationStateStreamCreateInfoEXT

instance ToCStruct PipelineRasterizationStateStreamCreateInfoEXT where
  withCStruct :: PipelineRasterizationStateStreamCreateInfoEXT
-> (Ptr PipelineRasterizationStateStreamCreateInfoEXT -> IO b)
-> IO b
withCStruct x :: PipelineRasterizationStateStreamCreateInfoEXT
x f :: Ptr PipelineRasterizationStateStreamCreateInfoEXT -> IO b
f = Int
-> Int
-> (Ptr PipelineRasterizationStateStreamCreateInfoEXT -> IO b)
-> IO b
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned 24 8 ((Ptr PipelineRasterizationStateStreamCreateInfoEXT -> IO b)
 -> IO b)
-> (Ptr PipelineRasterizationStateStreamCreateInfoEXT -> IO b)
-> IO b
forall a b. (a -> b) -> a -> b
$ \p :: Ptr PipelineRasterizationStateStreamCreateInfoEXT
p -> Ptr PipelineRasterizationStateStreamCreateInfoEXT
-> PipelineRasterizationStateStreamCreateInfoEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PipelineRasterizationStateStreamCreateInfoEXT
p PipelineRasterizationStateStreamCreateInfoEXT
x (Ptr PipelineRasterizationStateStreamCreateInfoEXT -> IO b
f Ptr PipelineRasterizationStateStreamCreateInfoEXT
p)
  pokeCStruct :: Ptr PipelineRasterizationStateStreamCreateInfoEXT
-> PipelineRasterizationStateStreamCreateInfoEXT -> IO b -> IO b
pokeCStruct p :: Ptr PipelineRasterizationStateStreamCreateInfoEXT
p PipelineRasterizationStateStreamCreateInfoEXT{..} f :: IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineRasterizationStateStreamCreateInfoEXT
p Ptr PipelineRasterizationStateStreamCreateInfoEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineRasterizationStateStreamCreateInfoEXT
p Ptr PipelineRasterizationStateStreamCreateInfoEXT
-> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineRasterizationStateStreamCreateInfoEXT
p Ptr PipelineRasterizationStateStreamCreateInfoEXT
-> Int -> Ptr PipelineRasterizationStateStreamCreateFlagsEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr PipelineRasterizationStateStreamCreateFlagsEXT)) (PipelineRasterizationStateStreamCreateFlagsEXT
flags)
    Ptr ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineRasterizationStateStreamCreateInfoEXT
p Ptr PipelineRasterizationStateStreamCreateInfoEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 20 :: Ptr Word32)) ("firstBinding" ::: Word32
rasterizationStream)
    IO b
f
  cStructSize :: Int
cStructSize = 24
  cStructAlignment :: Int
cStructAlignment = 8
  pokeZeroCStruct :: Ptr PipelineRasterizationStateStreamCreateInfoEXT -> IO b -> IO b
pokeZeroCStruct p :: Ptr PipelineRasterizationStateStreamCreateInfoEXT
p f :: IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineRasterizationStateStreamCreateInfoEXT
p Ptr PipelineRasterizationStateStreamCreateInfoEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineRasterizationStateStreamCreateInfoEXT
p Ptr PipelineRasterizationStateStreamCreateInfoEXT
-> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr ("firstBinding" ::: Word32)
-> ("firstBinding" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineRasterizationStateStreamCreateInfoEXT
p Ptr PipelineRasterizationStateStreamCreateInfoEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 20 :: Ptr Word32)) ("firstBinding" ::: Word32
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct PipelineRasterizationStateStreamCreateInfoEXT where
  peekCStruct :: Ptr PipelineRasterizationStateStreamCreateInfoEXT
-> IO PipelineRasterizationStateStreamCreateInfoEXT
peekCStruct p :: Ptr PipelineRasterizationStateStreamCreateInfoEXT
p = do
    PipelineRasterizationStateStreamCreateFlagsEXT
flags <- Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> IO PipelineRasterizationStateStreamCreateFlagsEXT
forall a. Storable a => Ptr a -> IO a
peek @PipelineRasterizationStateStreamCreateFlagsEXT ((Ptr PipelineRasterizationStateStreamCreateInfoEXT
p Ptr PipelineRasterizationStateStreamCreateInfoEXT
-> Int -> Ptr PipelineRasterizationStateStreamCreateFlagsEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr PipelineRasterizationStateStreamCreateFlagsEXT))
    "firstBinding" ::: Word32
rasterizationStream <- Ptr ("firstBinding" ::: Word32) -> IO ("firstBinding" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PipelineRasterizationStateStreamCreateInfoEXT
p Ptr PipelineRasterizationStateStreamCreateInfoEXT
-> Int -> Ptr ("firstBinding" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 20 :: Ptr Word32))
    PipelineRasterizationStateStreamCreateInfoEXT
-> IO PipelineRasterizationStateStreamCreateInfoEXT
forall (f :: * -> *) a. Applicative f => a -> f a
pure (PipelineRasterizationStateStreamCreateInfoEXT
 -> IO PipelineRasterizationStateStreamCreateInfoEXT)
-> PipelineRasterizationStateStreamCreateInfoEXT
-> IO PipelineRasterizationStateStreamCreateInfoEXT
forall a b. (a -> b) -> a -> b
$ PipelineRasterizationStateStreamCreateFlagsEXT
-> ("firstBinding" ::: Word32)
-> PipelineRasterizationStateStreamCreateInfoEXT
PipelineRasterizationStateStreamCreateInfoEXT
             PipelineRasterizationStateStreamCreateFlagsEXT
flags "firstBinding" ::: Word32
rasterizationStream

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

instance Zero PipelineRasterizationStateStreamCreateInfoEXT where
  zero :: PipelineRasterizationStateStreamCreateInfoEXT
zero = PipelineRasterizationStateStreamCreateFlagsEXT
-> ("firstBinding" ::: Word32)
-> PipelineRasterizationStateStreamCreateInfoEXT
PipelineRasterizationStateStreamCreateInfoEXT
           PipelineRasterizationStateStreamCreateFlagsEXT
forall a. Zero a => a
zero
           "firstBinding" ::: Word32
forall a. Zero a => a
zero


-- | VkPipelineRasterizationStateStreamCreateFlagsEXT - Reserved for future
-- use
--
-- = Description
--
-- 'PipelineRasterizationStateStreamCreateFlagsEXT' is a bitmask type for
-- setting a mask, but is currently reserved for future use.
--
-- = See Also
--
-- 'PipelineRasterizationStateStreamCreateInfoEXT'
newtype PipelineRasterizationStateStreamCreateFlagsEXT = PipelineRasterizationStateStreamCreateFlagsEXT Flags
  deriving newtype (PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
(PipelineRasterizationStateStreamCreateFlagsEXT
 -> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool)
-> Eq PipelineRasterizationStateStreamCreateFlagsEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
$c/= :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
== :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
$c== :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
Eq, Eq PipelineRasterizationStateStreamCreateFlagsEXT
Eq PipelineRasterizationStateStreamCreateFlagsEXT =>
(PipelineRasterizationStateStreamCreateFlagsEXT
 -> PipelineRasterizationStateStreamCreateFlagsEXT -> Ordering)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> Ord PipelineRasterizationStateStreamCreateFlagsEXT
PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Ordering
PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
$cmin :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
max :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
$cmax :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
>= :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
$c>= :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
> :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
$c> :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
<= :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
$c<= :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
< :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
$c< :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
compare :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Ordering
$ccompare :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> Ordering
$cp1Ord :: Eq PipelineRasterizationStateStreamCreateFlagsEXT
Ord, Ptr b -> Int -> IO PipelineRasterizationStateStreamCreateFlagsEXT
Ptr b
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ()
Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> IO PipelineRasterizationStateStreamCreateFlagsEXT
Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> IO PipelineRasterizationStateStreamCreateFlagsEXT
Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ()
Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ()
PipelineRasterizationStateStreamCreateFlagsEXT -> Int
(PipelineRasterizationStateStreamCreateFlagsEXT -> Int)
-> (PipelineRasterizationStateStreamCreateFlagsEXT -> Int)
-> (Ptr PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> IO PipelineRasterizationStateStreamCreateFlagsEXT)
-> (Ptr PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ())
-> (forall b.
    Ptr b -> Int -> IO PipelineRasterizationStateStreamCreateFlagsEXT)
-> (forall b.
    Ptr b
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ())
-> (Ptr PipelineRasterizationStateStreamCreateFlagsEXT
    -> IO PipelineRasterizationStateStreamCreateFlagsEXT)
-> (Ptr PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ())
-> Storable PipelineRasterizationStateStreamCreateFlagsEXT
forall b.
Ptr b -> Int -> IO PipelineRasterizationStateStreamCreateFlagsEXT
forall b.
Ptr b
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ()
forall a.
(a -> Int)
-> (a -> Int)
-> (Ptr a -> Int -> IO a)
-> (Ptr a -> Int -> a -> IO ())
-> (forall b. Ptr b -> Int -> IO a)
-> (forall b. Ptr b -> Int -> a -> IO ())
-> (Ptr a -> IO a)
-> (Ptr a -> a -> IO ())
-> Storable a
poke :: Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ()
$cpoke :: Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ()
peek :: Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> IO PipelineRasterizationStateStreamCreateFlagsEXT
$cpeek :: Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> IO PipelineRasterizationStateStreamCreateFlagsEXT
pokeByteOff :: Ptr b
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ()
$cpokeByteOff :: forall b.
Ptr b
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ()
peekByteOff :: Ptr b -> Int -> IO PipelineRasterizationStateStreamCreateFlagsEXT
$cpeekByteOff :: forall b.
Ptr b -> Int -> IO PipelineRasterizationStateStreamCreateFlagsEXT
pokeElemOff :: Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ()
$cpokeElemOff :: Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT -> IO ()
peekElemOff :: Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> IO PipelineRasterizationStateStreamCreateFlagsEXT
$cpeekElemOff :: Ptr PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> IO PipelineRasterizationStateStreamCreateFlagsEXT
alignment :: PipelineRasterizationStateStreamCreateFlagsEXT -> Int
$calignment :: PipelineRasterizationStateStreamCreateFlagsEXT -> Int
sizeOf :: PipelineRasterizationStateStreamCreateFlagsEXT -> Int
$csizeOf :: PipelineRasterizationStateStreamCreateFlagsEXT -> Int
Storable, PipelineRasterizationStateStreamCreateFlagsEXT
PipelineRasterizationStateStreamCreateFlagsEXT
-> Zero PipelineRasterizationStateStreamCreateFlagsEXT
forall a. a -> Zero a
zero :: PipelineRasterizationStateStreamCreateFlagsEXT
$czero :: PipelineRasterizationStateStreamCreateFlagsEXT
Zero, Eq PipelineRasterizationStateStreamCreateFlagsEXT
PipelineRasterizationStateStreamCreateFlagsEXT
Eq PipelineRasterizationStateStreamCreateFlagsEXT =>
(PipelineRasterizationStateStreamCreateFlagsEXT
 -> PipelineRasterizationStateStreamCreateFlagsEXT
 -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> (Int -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT -> Int -> Bool)
-> (PipelineRasterizationStateStreamCreateFlagsEXT -> Maybe Int)
-> (PipelineRasterizationStateStreamCreateFlagsEXT -> Int)
-> (PipelineRasterizationStateStreamCreateFlagsEXT -> Bool)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT
    -> Int -> PipelineRasterizationStateStreamCreateFlagsEXT)
-> (PipelineRasterizationStateStreamCreateFlagsEXT -> Int)
-> Bits PipelineRasterizationStateStreamCreateFlagsEXT
Int -> PipelineRasterizationStateStreamCreateFlagsEXT
PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
PipelineRasterizationStateStreamCreateFlagsEXT -> Int
PipelineRasterizationStateStreamCreateFlagsEXT -> Maybe Int
PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
PipelineRasterizationStateStreamCreateFlagsEXT -> Int -> Bool
PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
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
popCount :: PipelineRasterizationStateStreamCreateFlagsEXT -> Int
$cpopCount :: PipelineRasterizationStateStreamCreateFlagsEXT -> Int
rotateR :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
$crotateR :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
rotateL :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
$crotateL :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
unsafeShiftR :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
$cunsafeShiftR :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
shiftR :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
$cshiftR :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
unsafeShiftL :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
$cunsafeShiftL :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
shiftL :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
$cshiftL :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
isSigned :: PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
$cisSigned :: PipelineRasterizationStateStreamCreateFlagsEXT -> Bool
bitSize :: PipelineRasterizationStateStreamCreateFlagsEXT -> Int
$cbitSize :: PipelineRasterizationStateStreamCreateFlagsEXT -> Int
bitSizeMaybe :: PipelineRasterizationStateStreamCreateFlagsEXT -> Maybe Int
$cbitSizeMaybe :: PipelineRasterizationStateStreamCreateFlagsEXT -> Maybe Int
testBit :: PipelineRasterizationStateStreamCreateFlagsEXT -> Int -> Bool
$ctestBit :: PipelineRasterizationStateStreamCreateFlagsEXT -> Int -> Bool
complementBit :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
$ccomplementBit :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
clearBit :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
$cclearBit :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
setBit :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
$csetBit :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
bit :: Int -> PipelineRasterizationStateStreamCreateFlagsEXT
$cbit :: Int -> PipelineRasterizationStateStreamCreateFlagsEXT
zeroBits :: PipelineRasterizationStateStreamCreateFlagsEXT
$czeroBits :: PipelineRasterizationStateStreamCreateFlagsEXT
rotate :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
$crotate :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
shift :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
$cshift :: PipelineRasterizationStateStreamCreateFlagsEXT
-> Int -> PipelineRasterizationStateStreamCreateFlagsEXT
complement :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
$ccomplement :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
xor :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
$cxor :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
.|. :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
$c.|. :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
.&. :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
$c.&. :: PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
-> PipelineRasterizationStateStreamCreateFlagsEXT
$cp1Bits :: Eq PipelineRasterizationStateStreamCreateFlagsEXT
Bits)



instance Show PipelineRasterizationStateStreamCreateFlagsEXT where
  showsPrec :: Int -> PipelineRasterizationStateStreamCreateFlagsEXT -> ShowS
showsPrec p :: Int
p = \case
    PipelineRasterizationStateStreamCreateFlagsEXT x :: "firstBinding" ::: Word32
x -> Bool -> ShowS -> ShowS
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= 11) (String -> ShowS
showString "PipelineRasterizationStateStreamCreateFlagsEXT 0x" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ("firstBinding" ::: Word32) -> ShowS
forall a. (Integral a, Show a) => a -> ShowS
showHex "firstBinding" ::: Word32
x)

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


type EXT_TRANSFORM_FEEDBACK_SPEC_VERSION = 1

-- No documentation found for TopLevel "VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION"
pattern EXT_TRANSFORM_FEEDBACK_SPEC_VERSION :: forall a . Integral a => a
pattern $bEXT_TRANSFORM_FEEDBACK_SPEC_VERSION :: a
$mEXT_TRANSFORM_FEEDBACK_SPEC_VERSION :: forall r a. Integral a => a -> (Void# -> r) -> (Void# -> r) -> r
EXT_TRANSFORM_FEEDBACK_SPEC_VERSION = 1


type EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME = "VK_EXT_transform_feedback"

-- No documentation found for TopLevel "VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME"
pattern EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $bEXT_TRANSFORM_FEEDBACK_EXTENSION_NAME :: a
$mEXT_TRANSFORM_FEEDBACK_EXTENSION_NAME :: forall r a.
(Eq a, IsString a) =>
a -> (Void# -> r) -> (Void# -> r) -> r
EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME = "VK_EXT_transform_feedback"