{-# language CPP #-}
-- | = Name
--
-- VK_EXT_multi_draw - device extension
--
-- == VK_EXT_multi_draw
--
-- [__Name String__]
--     @VK_EXT_multi_draw@
--
-- [__Extension Type__]
--     Device extension
--
-- [__Registered Extension Number__]
--     393
--
-- [__Revision__]
--     1
--
-- [__Extension and Version Dependencies__]
--
--     -   Requires Vulkan 1.0
--
-- [__Contact__]
--
--     -   Mike Blumenkrantz
--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?body=[VK_EXT_multi_draw] @zmike%0A<<Here describe the issue or question you have about the VK_EXT_multi_draw extension>> >
--
-- == Other Extension Metadata
--
-- [__Last Modified Date__]
--     2021-05-19
--
-- [__IP Status__]
--     No known IP claims.
--
-- [__Contributors__]
--
--     -   Mike Blumenkrantz, VALVE
--
--     -   Piers Daniell, NVIDIA
--
--     -   Jason Ekstrand, INTEL
--
--     -   Spencer Fricke, SAMSUNG
--
--     -   Ricardo Garcia, IGALIA
--
--     -   Jon Leech, KHRONOS
--
--     -   Stu Smith, AMD
--
-- == Description
--
-- Processing multiple draw commands in sequence incurs measurable overhead
-- within drivers due to repeated state checks and updates during dispatch.
-- This extension enables passing the entire sequence of draws directly to
-- the driver in order to avoid any such overhead, using an array of
-- 'MultiDrawInfoEXT' or 'MultiDrawIndexedInfoEXT' structs with
-- 'cmdDrawMultiEXT' or 'cmdDrawMultiIndexedEXT', respectively. These
-- functions could be used any time multiple draw commands are being
-- recorded without any state changes between them in order to maximize
-- performance.
--
-- == New Commands
--
-- -   'cmdDrawMultiEXT'
--
-- -   'cmdDrawMultiIndexedEXT'
--
-- == New Structures
--
-- -   'MultiDrawIndexedInfoEXT'
--
-- -   'MultiDrawInfoEXT'
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
--     'Vulkan.Core10.Device.DeviceCreateInfo':
--
--     -   'PhysicalDeviceMultiDrawFeaturesEXT'
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2':
--
--     -   'PhysicalDeviceMultiDrawPropertiesEXT'
--
-- == New Enum Constants
--
-- -   'EXT_MULTI_DRAW_EXTENSION_NAME'
--
-- -   'EXT_MULTI_DRAW_SPEC_VERSION'
--
-- -   Extending 'Vulkan.Core10.Enums.StructureType.StructureType':
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT'
--
-- == New or Modified Built-In Variables
--
-- -   (modified)@DrawIndex@
--
-- == Version History
--
-- -   Revision 1, 2021-01-20 (Mike Blumenkrantz)
--
--     -   Initial version
--
-- == See Also
--
-- 'MultiDrawIndexedInfoEXT', 'MultiDrawInfoEXT',
-- 'PhysicalDeviceMultiDrawFeaturesEXT',
-- 'PhysicalDeviceMultiDrawPropertiesEXT', 'cmdDrawMultiEXT',
-- 'cmdDrawMultiIndexedEXT'
--
-- == Document Notes
--
-- For more information, see the
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_multi_draw Vulkan Specification>
--
-- This page is a generated document. Fixes and changes should be made to
-- the generator scripts, not directly.
module Vulkan.Extensions.VK_EXT_multi_draw  ( cmdDrawMultiEXT
                                            , cmdDrawMultiIndexedEXT
                                            , MultiDrawInfoEXT(..)
                                            , MultiDrawIndexedInfoEXT(..)
                                            , PhysicalDeviceMultiDrawPropertiesEXT(..)
                                            , PhysicalDeviceMultiDrawFeaturesEXT(..)
                                            , EXT_MULTI_DRAW_SPEC_VERSION
                                            , pattern EXT_MULTI_DRAW_SPEC_VERSION
                                            , EXT_MULTI_DRAW_EXTENSION_NAME
                                            , pattern EXT_MULTI_DRAW_EXTENSION_NAME
                                            ) where

import Vulkan.Internal.Utils (traceAroundEvent)
import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Foreign.Marshal.Alloc (allocaBytes)
import Foreign.Marshal.Utils (with)
import GHC.IO (throwIO)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (evalContT)
import qualified Data.Vector (imapM_)
import qualified Data.Vector (length)
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Zero (Zero(..))
import Control.Monad.IO.Class (MonadIO)
import Data.String (IsString)
import Data.Typeable (Typeable)
import Foreign.Storable (Storable)
import Foreign.Storable (Storable(peek))
import Foreign.Storable (Storable(poke))
import qualified Foreign.Storable (Storable(..))
import GHC.Generics (Generic)
import GHC.IO.Exception (IOErrorType(..))
import GHC.IO.Exception (IOException(..))
import Data.Int (Int32)
import Foreign.Ptr (FunPtr)
import Foreign.Ptr (Ptr)
import Data.Word (Word32)
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 (CommandBuffer)
import Vulkan.Core10.Handles (CommandBuffer(..))
import Vulkan.Core10.Handles (CommandBuffer(CommandBuffer))
import Vulkan.Core10.Handles (CommandBuffer_T)
import Vulkan.Dynamic (DeviceCmds(pVkCmdDrawMultiEXT))
import Vulkan.Dynamic (DeviceCmds(pVkCmdDrawMultiIndexedEXT))
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCmdDrawMultiEXT
  :: FunPtr (Ptr CommandBuffer_T -> Word32 -> Ptr MultiDrawInfoEXT -> Word32 -> Word32 -> Word32 -> IO ()) -> Ptr CommandBuffer_T -> Word32 -> Ptr MultiDrawInfoEXT -> Word32 -> Word32 -> Word32 -> IO ()

-- | vkCmdDrawMultiEXT - Draw primitives
--
-- = Description
--
-- @drawCount@ draws are executed with parameters taken from @pVertexInfo@.
-- The number of draw commands recorded is @drawCount@, with each command
-- reading, sequentially, a @firstVertex@ and a @vertexCount@ from
-- @pVertexInfo@.
--
-- == Valid Usage
--
-- -   #VUID-vkCmdDrawMultiEXT-magFilter-04553# If a
--     'Vulkan.Core10.Handles.Sampler' created with @magFilter@ or
--     @minFilter@ equal to 'Vulkan.Core10.Enums.Filter.FILTER_LINEAR' and
--     @compareEnable@ equal to 'Vulkan.Core10.FundamentalTypes.FALSE' is
--     used to sample a 'Vulkan.Core10.Handles.ImageView' 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'
--
-- -   #VUID-vkCmdDrawMultiEXT-mipmapMode-04770# If a
--     'Vulkan.Core10.Handles.Sampler' created with @mipmapMode@ equal to
--     'Vulkan.Core10.Enums.SamplerMipmapMode.SAMPLER_MIPMAP_MODE_LINEAR'
--     and @compareEnable@ equal to 'Vulkan.Core10.FundamentalTypes.FALSE'
--     is used to sample a 'Vulkan.Core10.Handles.ImageView' 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'
--
-- -   #VUID-vkCmdDrawMultiEXT-None-06479# If a
--     'Vulkan.Core10.Handles.ImageView' is sampled with
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#textures-depth-compare-operation depth comparison>,
--     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_KHR_acceleration_structure.FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR'
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02691# 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'
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02692# 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'
--
-- -   #VUID-vkCmdDrawMultiEXT-filterCubic-02694# 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'
--
-- -   #VUID-vkCmdDrawMultiEXT-filterCubicMinmax-02695# 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'
--
-- -   #VUID-vkCmdDrawMultiEXT-flags-02696# 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'
--
-- -   #VUID-vkCmdDrawMultiEXT-OpTypeImage-06423# Any
--     'Vulkan.Core10.Handles.ImageView' or
--     'Vulkan.Core10.Handles.BufferView' being written as a storage image
--     or storage texel buffer where the image format field of the
--     @OpTypeImage@ is @Unknown@ /must/ have image format features that
--     support
--     'Vulkan.Extensions.VK_KHR_acceleration_structure.FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR'
--
-- -   #VUID-vkCmdDrawMultiEXT-OpTypeImage-06424# Any
--     'Vulkan.Core10.Handles.ImageView' or
--     'Vulkan.Core10.Handles.BufferView' being read as a storage image or
--     storage texel buffer where the image format field of the
--     @OpTypeImage@ is @Unknown@ /must/ have image format features that
--     support
--     'Vulkan.Extensions.VK_KHR_acceleration_structure.FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR'
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02697# 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 ???>
--
-- -   #VUID-vkCmdDrawMultiEXT-maintenance4-06425# If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-maintenance4 maintenance4>
--     feature is not enabled, then 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 ???>
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02699# 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
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02700# A valid pipeline /must/ be bound
--     to the pipeline bind point used by this command
--
-- -   #VUID-vkCmdDrawMultiEXT-commandBuffer-02701# 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 or inherited (if the
--     @VK_NV_inherited_viewport_scissor@ extension is enabled) for
--     @commandBuffer@, and done so after any previously bound pipeline
--     with the corresponding state not specified as dynamic
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02859# 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
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02702# 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
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02703# 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
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02704# 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
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02705# 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
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02706# 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
--
-- -   #VUID-vkCmdDrawMultiEXT-commandBuffer-02707# If @commandBuffer@ is
--     an unprotected command buffer and
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#limits-protectedNoFault protectedNoFault>
--     is not supported, 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
--
-- -   #VUID-vkCmdDrawMultiEXT-None-04115# 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
--
-- -   #VUID-vkCmdDrawMultiEXT-OpImageWrite-04469# If a
--     'Vulkan.Core10.Handles.BufferView' 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
--     buffer view’s format
--
-- -   #VUID-vkCmdDrawMultiEXT-SampledType-04470# If a
--     'Vulkan.Core10.Handles.ImageView' with a
--     'Vulkan.Core10.Enums.Format.Format' that has a 64-bit component
--     width is accessed as a result of this command, the @SampledType@ of
--     the @OpTypeImage@ operand of that instruction /must/ have a @Width@
--     of 64
--
-- -   #VUID-vkCmdDrawMultiEXT-SampledType-04471# If a
--     'Vulkan.Core10.Handles.ImageView' with a
--     'Vulkan.Core10.Enums.Format.Format' that has a component width less
--     than 64-bit is accessed as a result of this command, the
--     @SampledType@ of the @OpTypeImage@ operand of that instruction
--     /must/ have a @Width@ of 32
--
-- -   #VUID-vkCmdDrawMultiEXT-SampledType-04472# If a
--     'Vulkan.Core10.Handles.BufferView' with a
--     'Vulkan.Core10.Enums.Format.Format' that has a 64-bit component
--     width is accessed as a result of this command, the @SampledType@ of
--     the @OpTypeImage@ operand of that instruction /must/ have a @Width@
--     of 64
--
-- -   #VUID-vkCmdDrawMultiEXT-SampledType-04473# If a
--     'Vulkan.Core10.Handles.BufferView' with a
--     'Vulkan.Core10.Enums.Format.Format' that has a component width less
--     than 64-bit is accessed as a result of this command, the
--     @SampledType@ of the @OpTypeImage@ operand of that instruction
--     /must/ have a @Width@ of 32
--
-- -   #VUID-vkCmdDrawMultiEXT-sparseImageInt64Atomics-04474# If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-sparseImageInt64Atomics sparseImageInt64Atomics>
--     feature is not enabled, 'Vulkan.Core10.Handles.Image' objects
--     created with the
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT'
--     flag /must/ not be accessed by atomic instructions through an
--     @OpTypeImage@ with a @SampledType@ with a @Width@ of 64 by this
--     command
--
-- -   #VUID-vkCmdDrawMultiEXT-sparseImageInt64Atomics-04475# If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-sparseImageInt64Atomics sparseImageInt64Atomics>
--     feature is not enabled, 'Vulkan.Core10.Handles.Buffer' objects
--     created with the
--     'Vulkan.Core10.Enums.BufferCreateFlagBits.BUFFER_CREATE_SPARSE_RESIDENCY_BIT'
--     flag /must/ not be accessed by atomic instructions through an
--     @OpTypeImage@ with a @SampledType@ with a @Width@ of 64 by this
--     command
--
-- -   #VUID-vkCmdDrawMultiEXT-renderPass-02684# 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'
--
-- -   #VUID-vkCmdDrawMultiEXT-subpass-02685# 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'
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02686# Every input attachment used by
--     the current subpass /must/ be bound to the pipeline via a descriptor
--     set
--
-- -   #VUID-vkCmdDrawMultiEXT-None-04584# 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, except for cases
--     involving read-only access to depth\/stencil attachments as
--     described in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#renderpass-attachment-nonattachment Render Pass>
--     chapter
--
-- -   #VUID-vkCmdDrawMultiEXT-maxMultiviewInstanceIndex-02688# 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@
--
-- -   #VUID-vkCmdDrawMultiEXT-sampleLocationsEnable-02689# 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
--
-- -   #VUID-vkCmdDrawMultiEXT-viewportCount-03417# 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
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing 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
--
-- -   #VUID-vkCmdDrawMultiEXT-scissorCount-03418# 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
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetScissorWithCountEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing 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
--
-- -   #VUID-vkCmdDrawMultiEXT-viewportCount-03419# 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
--     drawing 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'
--
-- -   #VUID-vkCmdDrawMultiEXT-viewportCount-04137# 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_VIEWPORT_W_SCALING_NV'
--     dynamic state enabled, then the bound graphics pipeline /must/ have
--     been created with
--     'Vulkan.Extensions.VK_NV_clip_space_w_scaling.PipelineViewportWScalingStateCreateInfoNV'::@viewportCount@
--     greater or equal to the @viewportCount@ parameter in the last call
--     to
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   #VUID-vkCmdDrawMultiEXT-viewportCount-04138# If the bound graphics
--     pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     and
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_W_SCALING_NV'
--     dynamic states enabled then the @viewportCount@ parameter in the
--     last call to
--     'Vulkan.Extensions.VK_NV_clip_space_w_scaling.cmdSetViewportWScalingNV'
--     /must/ be greater than or equal to the @viewportCount@ parameter in
--     the last call to
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   #VUID-vkCmdDrawMultiEXT-viewportCount-04139# 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_VIEWPORT_SHADING_RATE_PALETTE_NV'
--     dynamic state enabled, then the bound graphics pipeline /must/ have
--     been created with
--     'Vulkan.Extensions.VK_NV_shading_rate_image.PipelineViewportShadingRateImageStateCreateInfoNV'::@viewportCount@
--     greater or equal to the @viewportCount@ parameter in the last call
--     to
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   #VUID-vkCmdDrawMultiEXT-viewportCount-04140# If the bound graphics
--     pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     and
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV'
--     dynamic states enabled then the @viewportCount@ parameter in the
--     last call to
--     'Vulkan.Extensions.VK_NV_shading_rate_image.cmdSetViewportShadingRatePaletteNV'
--     /must/ be greater than or equal to the @viewportCount@ parameter in
--     the last call to
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   #VUID-vkCmdDrawMultiEXT-VkPipelineVieportCreateInfo-04141# If the
--     bound graphics pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     dynamic state enabled and a
--     'Vulkan.Extensions.VK_NV_viewport_swizzle.PipelineViewportSwizzleStateCreateInfoNV'
--     structure chained from @VkPipelineVieportCreateInfo@, then the bound
--     graphics pipeline /must/ have been created with
--     'Vulkan.Extensions.VK_NV_viewport_swizzle.PipelineViewportSwizzleStateCreateInfoNV'::@viewportCount@
--     greater or equal to the @viewportCount@ parameter in the last call
--     to
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   #VUID-vkCmdDrawMultiEXT-VkPipelineVieportCreateInfo-04142# If the
--     bound graphics pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     dynamic state enabled and a
--     'Vulkan.Extensions.VK_NV_scissor_exclusive.PipelineViewportExclusiveScissorStateCreateInfoNV'
--     structure chained from @VkPipelineVieportCreateInfo@, then the bound
--     graphics pipeline /must/ have been created with
--     'Vulkan.Extensions.VK_NV_scissor_exclusive.PipelineViewportExclusiveScissorStateCreateInfoNV'::@exclusiveScissorCount@
--     greater or equal to the @viewportCount@ parameter in the last call
--     to
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   #VUID-vkCmdDrawMultiEXT-None-04876# If the bound graphics pipeline
--     state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT'
--     dynamic state enabled then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetRasterizerDiscardEnableEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing command
--
-- -   #VUID-vkCmdDrawMultiEXT-None-04877# If the bound graphics pipeline
--     state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT'
--     dynamic state enabled then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetDepthBiasEnableEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing command
--
-- -   #VUID-vkCmdDrawMultiEXT-logicOp-04878# If the bound graphics
--     pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_LOGIC_OP_EXT'
--     dynamic state enabled then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetLogicOpEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing command and the @logicOp@ /must/ be a valid
--     'Vulkan.Core10.Enums.LogicOp.LogicOp' value
--
-- -   #VUID-vkCmdDrawMultiEXT-primitiveFragmentShadingRateWithMultipleViewports-04552#
--     If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#limits-primitiveFragmentShadingRateWithMultipleViewports primitiveFragmentShadingRateWithMultipleViewports>
--     limit is not supported, the bound graphics pipeline was created with
--     the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     dynamic state enabled, and any of the shader stages of the bound
--     graphics pipeline write to the @PrimitiveShadingRateKHR@ built-in,
--     then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing command, and the @viewportCount@ parameter of
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--     /must/ be @1@
--
-- -   #VUID-vkCmdDrawMultiEXT-blendEnable-04727# If rasterization is not
--     disabled in the bound graphics pipeline, then for each color
--     attachment in the subpass, if the corresponding image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     do not contain
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT',
--     then the @blendEnable@ member of the corresponding element of the
--     @pAttachments@ member of @pColorBlendState@ /must/ be
--     'Vulkan.Core10.FundamentalTypes.FALSE'
--
-- -   #VUID-vkCmdDrawMultiEXT-rasterizationSamples-04740# If rasterization
--     is not disabled in the bound graphics pipeline, and neither the
--     @VK_AMD_mixed_attachment_samples@ nor the
--     @VK_NV_framebuffer_mixed_samples@ extensions are enabled, then
--     'Vulkan.Core10.Pipeline.PipelineMultisampleStateCreateInfo'::@rasterizationSamples@
--     /must/ be the same as the current subpass color and\/or
--     depth\/stencil attachments
--
-- -   #VUID-vkCmdDrawMultiEXT-imageView-06172# If the current render pass
--     instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the @imageView@ member of @pDepthAttachment@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', and the @layout@ member of
--     @pDepthAttachment@ is
--     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL',
--     this command /must/ not write any values to the depth attachment
--
-- -   #VUID-vkCmdDrawMultiEXT-imageView-06173# If the current render pass
--     instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the @imageView@ member of @pStencilAttachment@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', and the @layout@ member of
--     @pStencilAttachment@ is
--     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL',
--     this command /must/ not write any values to the stencil attachment
--
-- -   #VUID-vkCmdDrawMultiEXT-imageView-06174# If the current render pass
--     instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the @imageView@ member of @pDepthAttachment@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', and the @layout@ member of
--     @pDepthAttachment@ is
--     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL',
--     this command /must/ not write any values to the depth attachment
--
-- -   #VUID-vkCmdDrawMultiEXT-imageView-06175# If the current render pass
--     instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the @imageView@ member of @pStencilAttachment@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', and the @layout@ member of
--     @pStencilAttachment@ is
--     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL',
--     this command /must/ not write any values to the stencil attachment
--
-- -   #VUID-vkCmdDrawMultiEXT-imageView-06176# If the current render pass
--     instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the @imageView@ member of @pDepthAttachment@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', and the @layout@ member of
--     @pDepthAttachment@ is
--     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL',
--     this command /must/ not write any values to the depth attachment
--
-- -   #VUID-vkCmdDrawMultiEXT-imageView-06177# If the current render pass
--     instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the @imageView@ member of @pStencilAttachment@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', and the @layout@ member of
--     @pStencilAttachment@ is
--     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL',
--     this command /must/ not write any values to the stencil attachment
--
-- -   #VUID-vkCmdDrawMultiEXT-viewMask-06178# If the current render pass
--     instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound graphics pipeline /must/ have been created with
--     a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.PipelineRenderingCreateInfoKHR'::@viewMask@
--     equal to
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@viewMask@
--
-- -   #VUID-vkCmdDrawMultiEXT-colorAttachmentCount-06179# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound graphics pipeline /must/ have been created with
--     a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.PipelineRenderingCreateInfoKHR'::@colorAttachmentCount@
--     equal to
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@colorAttachmentCount@
--
-- -   #VUID-vkCmdDrawMultiEXT-colorAttachmentCount-06180# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@colorAttachmentCount@
--     greater than @0@, then each element of the
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pColorAttachments@
--     array with a @imageView@ not equal to
--     'Vulkan.Core10.APIConstants.NULL_HANDLE' /must/ have been created
--     with a 'Vulkan.Core10.Enums.Format.Format' equal to the
--     corresponding element of
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.PipelineRenderingCreateInfoKHR'::@pColorAttachmentFormats@
--     used to create the currently bound graphics pipeline
--
-- -   #VUID-vkCmdDrawMultiEXT-pDepthAttachment-06181# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pDepthAttachment->pname@:imageView
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the value of
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.PipelineRenderingCreateInfoKHR'::@depthAttachmentFormat@
--     used to create the currently bound graphics pipeline /must/ be equal
--     to the 'Vulkan.Core10.Enums.Format.Format' used to create
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pDepthAttachment->pname@:imageView
--
-- -   #VUID-vkCmdDrawMultiEXT-pStencilAttachment-06182# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pStencilAttachment->pname@:imageView
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the value of
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.PipelineRenderingCreateInfoKHR'::@stencilAttachmentFormat@
--     used to create the currently bound graphics pipeline /must/ be equal
--     to the 'Vulkan.Core10.Enums.Format.Format' used to create
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pStencilAttachment->pname@:imageView
--
-- -   #VUID-vkCmdDrawMultiEXT-imageView-06183# If the current render pass
--     instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingFragmentShadingRateAttachmentInfoKHR'::@imageView@
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the currently
--     bound graphics pipeline /must/ have been created with
--     'Vulkan.Core10.Enums.PipelineCreateFlagBits.PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR'
--
-- -   #VUID-vkCmdDrawMultiEXT-imageView-06184# If the current render pass
--     instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingFragmentDensityMapAttachmentInfoEXT'::@imageView@
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the currently
--     bound graphics pipeline /must/ have been created with
--     'Vulkan.Core10.Enums.PipelineCreateFlagBits.PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT'
--
-- -   #VUID-vkCmdDrawMultiEXT-colorAttachmentCount-06185# If the currently
--     bound pipeline was created with a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     structure, and the current render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     with a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@colorAttachmentCount@
--     parameter greater than @0@, then each element of the
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pColorAttachments@
--     array with a @imageView@ not equal to
--     'Vulkan.Core10.APIConstants.NULL_HANDLE' /must/ have been created
--     with a sample count equal to the corresponding element of the
--     @pColorAttachmentSamples@ member of
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     used to create the currently bound graphics pipeline
--
-- -   #VUID-vkCmdDrawMultiEXT-pDepthAttachment-06186# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound pipeline was created with a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     structure, and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pDepthAttachment->pname@:imageView
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the value of the
--     @depthStencilAttachmentSamples@ member of
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     used to create the currently bound graphics pipeline /must/ be equal
--     to the sample count used to create
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pDepthAttachment->pname@:imageView
--
-- -   #VUID-vkCmdDrawMultiEXT-pStencilAttachment-06187# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound pipeline was created with a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     structure, and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pStencilAttachment->pname@:imageView
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the value of the
--     @depthStencilAttachmentSamples@ member of
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     used to create the currently bound graphics pipeline /must/ be equal
--     to the sample count used to create
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pStencilAttachment->pname@:imageView
--
-- -   #VUID-vkCmdDrawMultiEXT-colorAttachmentCount-06188# If the currently
--     bound pipeline was created without a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     structure, and the current render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     with a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@colorAttachmentCount@
--     parameter greater than @0@, then each element of the
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pColorAttachments@
--     array with a @imageView@ not equal to
--     'Vulkan.Core10.APIConstants.NULL_HANDLE' /must/ have been created
--     with a sample count equal to the value of
--     'Vulkan.Core10.Pipeline.PipelineMultisampleStateCreateInfo'::@rasterizationSamples@
--     used to create the currently bound graphics pipeline
--
-- -   #VUID-vkCmdDrawMultiEXT-pDepthAttachment-06189# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound pipeline was created without a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     structure, and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pDepthAttachment->pname@:imageView
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the value of
--     'Vulkan.Core10.Pipeline.PipelineMultisampleStateCreateInfo'::@rasterizationSamples@
--     used to create the currently bound graphics pipeline /must/ be equal
--     to the sample count used to create
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pDepthAttachment->pname@:imageView
--
-- -   #VUID-vkCmdDrawMultiEXT-pStencilAttachment-06190# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound pipeline was created without a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     structure, and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pStencilAttachment->pname@:imageView
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the value of
--     'Vulkan.Core10.Pipeline.PipelineMultisampleStateCreateInfo'::@rasterizationSamples@
--     used to create the currently bound graphics pipeline /must/ be equal
--     to the sample count used to create
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pStencilAttachment->pname@:imageView
--
-- -   #VUID-vkCmdDrawMultiEXT-renderPass-06198# If the current render pass
--     instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound pipeline /must/ have been created with a
--     'Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo'::@renderPass@
--     equal to 'Vulkan.Core10.APIConstants.NULL_HANDLE'
--
-- -   #VUID-vkCmdDrawMultiEXT-commandBuffer-02712# If @commandBuffer@ is a
--     protected command buffer and
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#limits-protectedNoFault protectedNoFault>
--     is not supported, any resource written to by the
--     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
--     point used by this command /must/ not be an unprotected resource
--
-- -   #VUID-vkCmdDrawMultiEXT-commandBuffer-02713# If @commandBuffer@ is a
--     protected command buffer and
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#limits-protectedNoFault protectedNoFault>
--     is not supported, pipeline stages other than the framebuffer-space
--     and compute stages in the 'Vulkan.Core10.Handles.Pipeline' object
--     bound to the pipeline bind point used by this command /must/ not
--     write to any resource
--
-- -   #VUID-vkCmdDrawMultiEXT-commandBuffer-04617# If any of the shader
--     stages of the 'Vulkan.Core10.Handles.Pipeline' bound to the pipeline
--     bind point used by this command uses the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-capabilities-table-RayQueryKHR RayQueryKHR>
--     capability, then @commandBuffer@ /must/ not be a protected command
--     buffer
--
-- -   #VUID-vkCmdDrawMultiEXT-None-04007# 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
--
-- -   #VUID-vkCmdDrawMultiEXT-None-04008# 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'
--
-- -   #VUID-vkCmdDrawMultiEXT-None-02721# 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 ???>
--
-- -   #VUID-vkCmdDrawMultiEXT-primitiveTopology-03420# 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
--     drawing 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
--
-- -   #VUID-vkCmdDrawMultiEXT-None-04912# If the bound graphics pipeline
--     was created with both the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VERTEX_INPUT_EXT'
--     and
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT'
--     dynamic states enabled, then
--     'Vulkan.Extensions.VK_EXT_vertex_input_dynamic_state.cmdSetVertexInputEXT'
--     /must/ have been called in the current command buffer prior to this
--     draw command
--
-- -   #VUID-vkCmdDrawMultiEXT-pStrides-04913# If the bound graphics
--     pipeline was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT'
--     dynamic state enabled, but not the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VERTEX_INPUT_EXT'
--     dynamic state enabled, then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdBindVertexBuffers2EXT'
--     /must/ have been called in the current command buffer prior to this
--     draw command, and the @pStrides@ parameter of
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdBindVertexBuffers2EXT'
--     /must/ not be @NULL@
--
-- -   #VUID-vkCmdDrawMultiEXT-None-04914# If the bound graphics pipeline
--     state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VERTEX_INPUT_EXT'
--     dynamic state enabled, then
--     'Vulkan.Extensions.VK_EXT_vertex_input_dynamic_state.cmdSetVertexInputEXT'
--     /must/ have been called in the current command buffer prior to this
--     draw command
--
-- -   #VUID-vkCmdDrawMultiEXT-None-04875# If the bound graphics pipeline
--     state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT'
--     dynamic state enabled then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetPatchControlPointsEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing command
--
-- -   #VUID-vkCmdDrawMultiEXT-None-04879# If the bound graphics pipeline
--     state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT'
--     dynamic state enabled then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetPrimitiveRestartEnableEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing command
--
-- -   #VUID-vkCmdDrawMultiEXT-stage-06481# The bound graphics pipeline
--     /must/ not have been created with the
--     'Vulkan.Core10.Pipeline.PipelineShaderStageCreateInfo'::@stage@
--     member of an element of
--     'Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo'::@pStages@ set
--     to
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_NV'
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_NV'
--
-- -   #VUID-vkCmdDrawMultiEXT-None-04933# The
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-multiDraw multiDraw>
--     feature /must/ be enabled
--
-- -   #VUID-vkCmdDrawMultiEXT-drawCount-04934# @drawCount@ /must/ be less
--     than 'PhysicalDeviceMultiDrawPropertiesEXT'::@maxMultiDrawCount@
--
-- -   #VUID-vkCmdDrawMultiEXT-drawCount-04935# If @drawCount@ is greater
--     than zero, @pVertexInfo@ /must/ be a valid pointer to memory
--     containing one or more valid instances of 'MultiDrawInfoEXT'
--     structures
--
-- -   #VUID-vkCmdDrawMultiEXT-stride-04936# @stride@ must be a multiple of
--     4
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkCmdDrawMultiEXT-commandBuffer-parameter# @commandBuffer@
--     /must/ be a valid 'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   #VUID-vkCmdDrawMultiEXT-commandBuffer-recording# @commandBuffer@
--     /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   #VUID-vkCmdDrawMultiEXT-commandBuffer-cmdpool# The
--     'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   #VUID-vkCmdDrawMultiEXT-renderpass# This command /must/ only be
--     called inside of a render pass instance
--
-- == 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> |
-- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+
-- | Primary                                                                                                                    | Inside                                                                                                                 | Graphics                                                                                                              |
-- | Secondary                                                                                                                  |                                                                                                                        |                                                                                                                       |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_multi_draw VK_EXT_multi_draw>,
-- 'Vulkan.Core10.Handles.CommandBuffer', 'MultiDrawInfoEXT'
cmdDrawMultiEXT :: forall io
                 . (MonadIO io)
                => -- | @commandBuffer@ is the command buffer into which the command is
                   -- recorded.
                   CommandBuffer
                -> -- | @pVertexInfo@ is a pointer to an array of 'MultiDrawInfoEXT' with vertex
                   -- information to be drawn.
                   ("vertexInfo" ::: Vector MultiDrawInfoEXT)
                -> -- | @instanceCount@ is the number of instances to draw.
                   ("instanceCount" ::: Word32)
                -> -- | @firstInstance@ is the instance ID of the first instance to draw.
                   ("firstInstance" ::: Word32)
                -> -- | @stride@ is the byte stride between consecutive elements of
                   -- @pVertexInfo@.
                   ("stride" ::: Word32)
                -> io ()
cmdDrawMultiEXT :: CommandBuffer
-> ("vertexInfo" ::: Vector MultiDrawInfoEXT)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> io ()
cmdDrawMultiEXT CommandBuffer
commandBuffer "vertexInfo" ::: Vector MultiDrawInfoEXT
vertexInfo "instanceCount" ::: Word32
instanceCount "instanceCount" ::: Word32
firstInstance "instanceCount" ::: Word32
stride = 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 vkCmdDrawMultiEXTPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> ("instanceCount" ::: Word32)
   -> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> IO ())
vkCmdDrawMultiEXTPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("instanceCount" ::: Word32)
      -> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
      -> ("instanceCount" ::: Word32)
      -> ("instanceCount" ::: Word32)
      -> ("instanceCount" ::: Word32)
      -> IO ())
pVkCmdDrawMultiEXT (case CommandBuffer
commandBuffer of CommandBuffer{DeviceCmds
$sel:deviceCmds:CommandBuffer :: CommandBuffer -> DeviceCmds
deviceCmds :: DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  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
   -> ("instanceCount" ::: Word32)
   -> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> IO ())
vkCmdDrawMultiEXTPtr FunPtr
  (Ptr CommandBuffer_T
   -> ("instanceCount" ::: Word32)
   -> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("instanceCount" ::: Word32)
      -> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
      -> ("instanceCount" ::: Word32)
      -> ("instanceCount" ::: Word32)
      -> ("instanceCount" ::: Word32)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> ("instanceCount" ::: Word32)
   -> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: 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 String
"" String
"The function pointer for vkCmdDrawMultiEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdDrawMultiEXT' :: Ptr CommandBuffer_T
-> ("instanceCount" ::: Word32)
-> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> IO ()
vkCmdDrawMultiEXT' = FunPtr
  (Ptr CommandBuffer_T
   -> ("instanceCount" ::: Word32)
   -> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> IO ())
-> Ptr CommandBuffer_T
-> ("instanceCount" ::: Word32)
-> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> IO ()
mkVkCmdDrawMultiEXT FunPtr
  (Ptr CommandBuffer_T
   -> ("instanceCount" ::: Word32)
   -> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> IO ())
vkCmdDrawMultiEXTPtr
  "pVertexInfo" ::: Ptr MultiDrawInfoEXT
pPVertexInfo <- ((("pVertexInfo" ::: Ptr MultiDrawInfoEXT) -> IO ()) -> IO ())
-> ContT () IO ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pVertexInfo" ::: Ptr MultiDrawInfoEXT) -> IO ()) -> IO ())
 -> ContT () IO ("pVertexInfo" ::: Ptr MultiDrawInfoEXT))
-> ((("pVertexInfo" ::: Ptr MultiDrawInfoEXT) -> IO ()) -> IO ())
-> ContT () IO ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
forall a b. (a -> b) -> a -> b
$ Int -> (("pVertexInfo" ::: Ptr MultiDrawInfoEXT) -> IO ()) -> IO ()
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes @MultiDrawInfoEXT ((("vertexInfo" ::: Vector MultiDrawInfoEXT) -> Int
forall a. Vector a -> Int
Data.Vector.length ("vertexInfo" ::: Vector MultiDrawInfoEXT
vertexInfo)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
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 -> MultiDrawInfoEXT -> IO ())
-> ("vertexInfo" ::: Vector MultiDrawInfoEXT) -> IO ()
forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\Int
i MultiDrawInfoEXT
e -> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> MultiDrawInfoEXT -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ("pVertexInfo" ::: Ptr MultiDrawInfoEXT
pPVertexInfo ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> Int -> "pVertexInfo" ::: Ptr MultiDrawInfoEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr MultiDrawInfoEXT) (MultiDrawInfoEXT
e)) ("vertexInfo" ::: Vector MultiDrawInfoEXT
vertexInfo)
  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
$ String -> IO () -> IO ()
forall a. String -> IO a -> IO a
traceAroundEvent String
"vkCmdDrawMultiEXT" (Ptr CommandBuffer_T
-> ("instanceCount" ::: Word32)
-> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> IO ()
vkCmdDrawMultiEXT' (CommandBuffer -> Ptr CommandBuffer_T
commandBufferHandle (CommandBuffer
commandBuffer)) ((Int -> "instanceCount" ::: Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (("vertexInfo" ::: Vector MultiDrawInfoEXT) -> Int
forall a. Vector a -> Int
Data.Vector.length (("vertexInfo" ::: Vector MultiDrawInfoEXT) -> Int)
-> ("vertexInfo" ::: Vector MultiDrawInfoEXT) -> Int
forall a b. (a -> b) -> a -> b
$ ("vertexInfo" ::: Vector MultiDrawInfoEXT
vertexInfo)) :: Word32)) ("pVertexInfo" ::: Ptr MultiDrawInfoEXT
pPVertexInfo) ("instanceCount" ::: Word32
instanceCount) ("instanceCount" ::: Word32
firstInstance) ("instanceCount" ::: Word32
stride))
  () -> 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" mkVkCmdDrawMultiIndexedEXT
  :: FunPtr (Ptr CommandBuffer_T -> Word32 -> Ptr MultiDrawIndexedInfoEXT -> Word32 -> Word32 -> Word32 -> Ptr Int32 -> IO ()) -> Ptr CommandBuffer_T -> Word32 -> Ptr MultiDrawIndexedInfoEXT -> Word32 -> Word32 -> Word32 -> Ptr Int32 -> IO ()

-- | vkCmdDrawMultiIndexedEXT - Draw primitives
--
-- = Description
--
-- @drawCount@ indexed draws are executed with parameters taken from
-- @pIndexInfo@. The number of draw commands recorded is @drawCount@, with
-- each command reading, sequentially, a @firstIndex@ and an @indexCount@
-- from @pIndexInfo@. If @pVertexOffset@ is @NULL@, a @vertexOffset@ is
-- also read from @pIndexInfo@, otherwise the value from dereferencing
-- @pVertexOffset@ is used.
--
-- == Valid Usage
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-magFilter-04553# If a
--     'Vulkan.Core10.Handles.Sampler' created with @magFilter@ or
--     @minFilter@ equal to 'Vulkan.Core10.Enums.Filter.FILTER_LINEAR' and
--     @compareEnable@ equal to 'Vulkan.Core10.FundamentalTypes.FALSE' is
--     used to sample a 'Vulkan.Core10.Handles.ImageView' 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'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-mipmapMode-04770# If a
--     'Vulkan.Core10.Handles.Sampler' created with @mipmapMode@ equal to
--     'Vulkan.Core10.Enums.SamplerMipmapMode.SAMPLER_MIPMAP_MODE_LINEAR'
--     and @compareEnable@ equal to 'Vulkan.Core10.FundamentalTypes.FALSE'
--     is used to sample a 'Vulkan.Core10.Handles.ImageView' 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'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-06479# If a
--     'Vulkan.Core10.Handles.ImageView' is sampled with
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#textures-depth-compare-operation depth comparison>,
--     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_KHR_acceleration_structure.FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02691# 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'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02692# 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'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-filterCubic-02694# 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'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-filterCubicMinmax-02695# 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'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-flags-02696# 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'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-OpTypeImage-06423# Any
--     'Vulkan.Core10.Handles.ImageView' or
--     'Vulkan.Core10.Handles.BufferView' being written as a storage image
--     or storage texel buffer where the image format field of the
--     @OpTypeImage@ is @Unknown@ /must/ have image format features that
--     support
--     'Vulkan.Extensions.VK_KHR_acceleration_structure.FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-OpTypeImage-06424# Any
--     'Vulkan.Core10.Handles.ImageView' or
--     'Vulkan.Core10.Handles.BufferView' being read as a storage image or
--     storage texel buffer where the image format field of the
--     @OpTypeImage@ is @Unknown@ /must/ have image format features that
--     support
--     'Vulkan.Extensions.VK_KHR_acceleration_structure.FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02697# 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 ???>
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-maintenance4-06425# If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-maintenance4 maintenance4>
--     feature is not enabled, then 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 ???>
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02699# 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02700# A valid pipeline /must/
--     be bound to the pipeline bind point used by this command
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-commandBuffer-02701# 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 or inherited (if the
--     @VK_NV_inherited_viewport_scissor@ extension is enabled) for
--     @commandBuffer@, and done so after any previously bound pipeline
--     with the corresponding state not specified as dynamic
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02859# 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02702# 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02703# 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02704# 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02705# 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02706# 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-commandBuffer-02707# If
--     @commandBuffer@ is an unprotected command buffer and
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#limits-protectedNoFault protectedNoFault>
--     is not supported, 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-04115# 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-OpImageWrite-04469# If a
--     'Vulkan.Core10.Handles.BufferView' 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
--     buffer view’s format
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-SampledType-04470# If a
--     'Vulkan.Core10.Handles.ImageView' with a
--     'Vulkan.Core10.Enums.Format.Format' that has a 64-bit component
--     width is accessed as a result of this command, the @SampledType@ of
--     the @OpTypeImage@ operand of that instruction /must/ have a @Width@
--     of 64
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-SampledType-04471# If a
--     'Vulkan.Core10.Handles.ImageView' with a
--     'Vulkan.Core10.Enums.Format.Format' that has a component width less
--     than 64-bit is accessed as a result of this command, the
--     @SampledType@ of the @OpTypeImage@ operand of that instruction
--     /must/ have a @Width@ of 32
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-SampledType-04472# If a
--     'Vulkan.Core10.Handles.BufferView' with a
--     'Vulkan.Core10.Enums.Format.Format' that has a 64-bit component
--     width is accessed as a result of this command, the @SampledType@ of
--     the @OpTypeImage@ operand of that instruction /must/ have a @Width@
--     of 64
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-SampledType-04473# If a
--     'Vulkan.Core10.Handles.BufferView' with a
--     'Vulkan.Core10.Enums.Format.Format' that has a component width less
--     than 64-bit is accessed as a result of this command, the
--     @SampledType@ of the @OpTypeImage@ operand of that instruction
--     /must/ have a @Width@ of 32
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-sparseImageInt64Atomics-04474# If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-sparseImageInt64Atomics sparseImageInt64Atomics>
--     feature is not enabled, 'Vulkan.Core10.Handles.Image' objects
--     created with the
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT'
--     flag /must/ not be accessed by atomic instructions through an
--     @OpTypeImage@ with a @SampledType@ with a @Width@ of 64 by this
--     command
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-sparseImageInt64Atomics-04475# If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-sparseImageInt64Atomics sparseImageInt64Atomics>
--     feature is not enabled, 'Vulkan.Core10.Handles.Buffer' objects
--     created with the
--     'Vulkan.Core10.Enums.BufferCreateFlagBits.BUFFER_CREATE_SPARSE_RESIDENCY_BIT'
--     flag /must/ not be accessed by atomic instructions through an
--     @OpTypeImage@ with a @SampledType@ with a @Width@ of 64 by this
--     command
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-renderPass-02684# 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'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-subpass-02685# 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'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02686# Every input attachment
--     used by the current subpass /must/ be bound to the pipeline via a
--     descriptor set
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-04584# 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, except for
--     cases involving read-only access to depth\/stencil attachments as
--     described in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#renderpass-attachment-nonattachment Render Pass>
--     chapter
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-maxMultiviewInstanceIndex-02688# 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@
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-sampleLocationsEnable-02689# 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-viewportCount-03417# 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
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-scissorCount-03418# 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
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetScissorWithCountEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-viewportCount-03419# 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
--     drawing 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'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-viewportCount-04137# 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_VIEWPORT_W_SCALING_NV'
--     dynamic state enabled, then the bound graphics pipeline /must/ have
--     been created with
--     'Vulkan.Extensions.VK_NV_clip_space_w_scaling.PipelineViewportWScalingStateCreateInfoNV'::@viewportCount@
--     greater or equal to the @viewportCount@ parameter in the last call
--     to
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-viewportCount-04138# If the bound
--     graphics pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     and
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_W_SCALING_NV'
--     dynamic states enabled then the @viewportCount@ parameter in the
--     last call to
--     'Vulkan.Extensions.VK_NV_clip_space_w_scaling.cmdSetViewportWScalingNV'
--     /must/ be greater than or equal to the @viewportCount@ parameter in
--     the last call to
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-viewportCount-04139# 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_VIEWPORT_SHADING_RATE_PALETTE_NV'
--     dynamic state enabled, then the bound graphics pipeline /must/ have
--     been created with
--     'Vulkan.Extensions.VK_NV_shading_rate_image.PipelineViewportShadingRateImageStateCreateInfoNV'::@viewportCount@
--     greater or equal to the @viewportCount@ parameter in the last call
--     to
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-viewportCount-04140# If the bound
--     graphics pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     and
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV'
--     dynamic states enabled then the @viewportCount@ parameter in the
--     last call to
--     'Vulkan.Extensions.VK_NV_shading_rate_image.cmdSetViewportShadingRatePaletteNV'
--     /must/ be greater than or equal to the @viewportCount@ parameter in
--     the last call to
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-VkPipelineVieportCreateInfo-04141# If
--     the bound graphics pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     dynamic state enabled and a
--     'Vulkan.Extensions.VK_NV_viewport_swizzle.PipelineViewportSwizzleStateCreateInfoNV'
--     structure chained from @VkPipelineVieportCreateInfo@, then the bound
--     graphics pipeline /must/ have been created with
--     'Vulkan.Extensions.VK_NV_viewport_swizzle.PipelineViewportSwizzleStateCreateInfoNV'::@viewportCount@
--     greater or equal to the @viewportCount@ parameter in the last call
--     to
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-VkPipelineVieportCreateInfo-04142# If
--     the bound graphics pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     dynamic state enabled and a
--     'Vulkan.Extensions.VK_NV_scissor_exclusive.PipelineViewportExclusiveScissorStateCreateInfoNV'
--     structure chained from @VkPipelineVieportCreateInfo@, then the bound
--     graphics pipeline /must/ have been created with
--     'Vulkan.Extensions.VK_NV_scissor_exclusive.PipelineViewportExclusiveScissorStateCreateInfoNV'::@exclusiveScissorCount@
--     greater or equal to the @viewportCount@ parameter in the last call
--     to
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-04876# If the bound graphics
--     pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT'
--     dynamic state enabled then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetRasterizerDiscardEnableEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing command
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-04877# If the bound graphics
--     pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT'
--     dynamic state enabled then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetDepthBiasEnableEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing command
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-logicOp-04878# If the bound graphics
--     pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_LOGIC_OP_EXT'
--     dynamic state enabled then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetLogicOpEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing command and the @logicOp@ /must/ be a valid
--     'Vulkan.Core10.Enums.LogicOp.LogicOp' value
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-primitiveFragmentShadingRateWithMultipleViewports-04552#
--     If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#limits-primitiveFragmentShadingRateWithMultipleViewports primitiveFragmentShadingRateWithMultipleViewports>
--     limit is not supported, the bound graphics pipeline was created with
--     the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT'
--     dynamic state enabled, and any of the shader stages of the bound
--     graphics pipeline write to the @PrimitiveShadingRateKHR@ built-in,
--     then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing command, and the @viewportCount@ parameter of
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--     /must/ be @1@
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-blendEnable-04727# If rasterization
--     is not disabled in the bound graphics pipeline, then for each color
--     attachment in the subpass, if the corresponding image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     do not contain
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT',
--     then the @blendEnable@ member of the corresponding element of the
--     @pAttachments@ member of @pColorBlendState@ /must/ be
--     'Vulkan.Core10.FundamentalTypes.FALSE'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-rasterizationSamples-04740# If
--     rasterization is not disabled in the bound graphics pipeline, and
--     neither the @VK_AMD_mixed_attachment_samples@ nor the
--     @VK_NV_framebuffer_mixed_samples@ extensions are enabled, then
--     'Vulkan.Core10.Pipeline.PipelineMultisampleStateCreateInfo'::@rasterizationSamples@
--     /must/ be the same as the current subpass color and\/or
--     depth\/stencil attachments
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-imageView-06172# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the @imageView@ member of @pDepthAttachment@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', and the @layout@ member of
--     @pDepthAttachment@ is
--     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL',
--     this command /must/ not write any values to the depth attachment
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-imageView-06173# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the @imageView@ member of @pStencilAttachment@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', and the @layout@ member of
--     @pStencilAttachment@ is
--     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL',
--     this command /must/ not write any values to the stencil attachment
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-imageView-06174# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the @imageView@ member of @pDepthAttachment@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', and the @layout@ member of
--     @pDepthAttachment@ is
--     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL',
--     this command /must/ not write any values to the depth attachment
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-imageView-06175# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the @imageView@ member of @pStencilAttachment@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', and the @layout@ member of
--     @pStencilAttachment@ is
--     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL',
--     this command /must/ not write any values to the stencil attachment
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-imageView-06176# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the @imageView@ member of @pDepthAttachment@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', and the @layout@ member of
--     @pDepthAttachment@ is
--     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL',
--     this command /must/ not write any values to the depth attachment
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-imageView-06177# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the @imageView@ member of @pStencilAttachment@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', and the @layout@ member of
--     @pStencilAttachment@ is
--     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL',
--     this command /must/ not write any values to the stencil attachment
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-viewMask-06178# If the current render
--     pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound graphics pipeline /must/ have been created with
--     a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.PipelineRenderingCreateInfoKHR'::@viewMask@
--     equal to
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@viewMask@
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-colorAttachmentCount-06179# If the
--     current render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound graphics pipeline /must/ have been created with
--     a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.PipelineRenderingCreateInfoKHR'::@colorAttachmentCount@
--     equal to
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@colorAttachmentCount@
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-colorAttachmentCount-06180# If the
--     current render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@colorAttachmentCount@
--     greater than @0@, then each element of the
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pColorAttachments@
--     array with a @imageView@ not equal to
--     'Vulkan.Core10.APIConstants.NULL_HANDLE' /must/ have been created
--     with a 'Vulkan.Core10.Enums.Format.Format' equal to the
--     corresponding element of
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.PipelineRenderingCreateInfoKHR'::@pColorAttachmentFormats@
--     used to create the currently bound graphics pipeline
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-pDepthAttachment-06181# If the
--     current render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pDepthAttachment->pname@:imageView
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the value of
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.PipelineRenderingCreateInfoKHR'::@depthAttachmentFormat@
--     used to create the currently bound graphics pipeline /must/ be equal
--     to the 'Vulkan.Core10.Enums.Format.Format' used to create
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pDepthAttachment->pname@:imageView
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-pStencilAttachment-06182# If the
--     current render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pStencilAttachment->pname@:imageView
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the value of
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.PipelineRenderingCreateInfoKHR'::@stencilAttachmentFormat@
--     used to create the currently bound graphics pipeline /must/ be equal
--     to the 'Vulkan.Core10.Enums.Format.Format' used to create
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pStencilAttachment->pname@:imageView
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-imageView-06183# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingFragmentShadingRateAttachmentInfoKHR'::@imageView@
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the currently
--     bound graphics pipeline /must/ have been created with
--     'Vulkan.Core10.Enums.PipelineCreateFlagBits.PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-imageView-06184# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingFragmentDensityMapAttachmentInfoEXT'::@imageView@
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the currently
--     bound graphics pipeline /must/ have been created with
--     'Vulkan.Core10.Enums.PipelineCreateFlagBits.PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-colorAttachmentCount-06185# If the
--     currently bound pipeline was created with a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     structure, and the current render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     with a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@colorAttachmentCount@
--     parameter greater than @0@, then each element of the
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pColorAttachments@
--     array with a @imageView@ not equal to
--     'Vulkan.Core10.APIConstants.NULL_HANDLE' /must/ have been created
--     with a sample count equal to the corresponding element of the
--     @pColorAttachmentSamples@ member of
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     used to create the currently bound graphics pipeline
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-pDepthAttachment-06186# If the
--     current render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound pipeline was created with a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     structure, and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pDepthAttachment->pname@:imageView
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the value of the
--     @depthStencilAttachmentSamples@ member of
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     used to create the currently bound graphics pipeline /must/ be equal
--     to the sample count used to create
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pDepthAttachment->pname@:imageView
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-pStencilAttachment-06187# If the
--     current render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound pipeline was created with a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     structure, and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pStencilAttachment->pname@:imageView
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the value of the
--     @depthStencilAttachmentSamples@ member of
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     used to create the currently bound graphics pipeline /must/ be equal
--     to the sample count used to create
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pStencilAttachment->pname@:imageView
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-colorAttachmentCount-06188# If the
--     currently bound pipeline was created without a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     structure, and the current render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR'
--     with a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@colorAttachmentCount@
--     parameter greater than @0@, then each element of the
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pColorAttachments@
--     array with a @imageView@ not equal to
--     'Vulkan.Core10.APIConstants.NULL_HANDLE' /must/ have been created
--     with a sample count equal to the value of
--     'Vulkan.Core10.Pipeline.PipelineMultisampleStateCreateInfo'::@rasterizationSamples@
--     used to create the currently bound graphics pipeline
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-pDepthAttachment-06189# If the
--     current render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound pipeline was created without a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     structure, and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pDepthAttachment->pname@:imageView
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the value of
--     'Vulkan.Core10.Pipeline.PipelineMultisampleStateCreateInfo'::@rasterizationSamples@
--     used to create the currently bound graphics pipeline /must/ be equal
--     to the sample count used to create
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pDepthAttachment->pname@:imageView
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-pStencilAttachment-06190# If the
--     current render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound pipeline was created without a
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoAMD'
--     or
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.AttachmentSampleCountInfoNV'
--     structure, and
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pStencilAttachment->pname@:imageView
--     was not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the value of
--     'Vulkan.Core10.Pipeline.PipelineMultisampleStateCreateInfo'::@rasterizationSamples@
--     used to create the currently bound graphics pipeline /must/ be equal
--     to the sample count used to create
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.RenderingInfoKHR'::@pStencilAttachment->pname@:imageView
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-renderPass-06198# If the current
--     render pass instance was begun with
--     'Vulkan.Extensions.VK_KHR_dynamic_rendering.cmdBeginRenderingKHR',
--     the currently bound pipeline /must/ have been created with a
--     'Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo'::@renderPass@
--     equal to 'Vulkan.Core10.APIConstants.NULL_HANDLE'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-commandBuffer-02712# If
--     @commandBuffer@ is a protected command buffer and
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#limits-protectedNoFault protectedNoFault>
--     is not supported, any resource written to by the
--     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
--     point used by this command /must/ not be an unprotected resource
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-commandBuffer-02713# If
--     @commandBuffer@ is a protected command buffer and
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#limits-protectedNoFault protectedNoFault>
--     is not supported, pipeline stages other than the framebuffer-space
--     and compute stages in the 'Vulkan.Core10.Handles.Pipeline' object
--     bound to the pipeline bind point used by this command /must/ not
--     write to any resource
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-commandBuffer-04617# If any of the
--     shader stages of the 'Vulkan.Core10.Handles.Pipeline' bound to the
--     pipeline bind point used by this command uses the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-capabilities-table-RayQueryKHR RayQueryKHR>
--     capability, then @commandBuffer@ /must/ not be a protected command
--     buffer
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-04007# 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-04008# 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'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-02721# 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 ???>
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-primitiveTopology-03420# 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
--     drawing 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
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-04912# If the bound graphics
--     pipeline was created with both the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VERTEX_INPUT_EXT'
--     and
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT'
--     dynamic states enabled, then
--     'Vulkan.Extensions.VK_EXT_vertex_input_dynamic_state.cmdSetVertexInputEXT'
--     /must/ have been called in the current command buffer prior to this
--     draw command
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-pStrides-04913# If the bound graphics
--     pipeline was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT'
--     dynamic state enabled, but not the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VERTEX_INPUT_EXT'
--     dynamic state enabled, then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdBindVertexBuffers2EXT'
--     /must/ have been called in the current command buffer prior to this
--     draw command, and the @pStrides@ parameter of
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdBindVertexBuffers2EXT'
--     /must/ not be @NULL@
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-04914# If the bound graphics
--     pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_VERTEX_INPUT_EXT'
--     dynamic state enabled, then
--     'Vulkan.Extensions.VK_EXT_vertex_input_dynamic_state.cmdSetVertexInputEXT'
--     /must/ have been called in the current command buffer prior to this
--     draw command
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-04875# If the bound graphics
--     pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT'
--     dynamic state enabled then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetPatchControlPointsEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing command
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-04879# If the bound graphics
--     pipeline state was created with the
--     'Vulkan.Core10.Enums.DynamicState.DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT'
--     dynamic state enabled then
--     'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetPrimitiveRestartEnableEXT'
--     /must/ have been called in the current command buffer prior to this
--     drawing command
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-stage-06481# The bound graphics
--     pipeline /must/ not have been created with the
--     'Vulkan.Core10.Pipeline.PipelineShaderStageCreateInfo'::@stage@
--     member of an element of
--     'Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo'::@pStages@ set
--     to
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_NV'
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_NV'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-None-04937# The
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-multiDraw multiDraw>
--     feature /must/ be enabled
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-firstIndex-04938# (@indexSize@ ×
--     (@firstIndex@ + @indexCount@) + @offset@) /must/ be less than or
--     equal to the size of the bound index buffer, with @indexSize@ being
--     based on the type specified by @indexType@, where the index buffer,
--     @indexType@, and @offset@ are specified via
--     'Vulkan.Core10.CommandBufferBuilding.cmdBindIndexBuffer'
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-drawCount-04939# @drawCount@ /must/
--     be less than
--     'PhysicalDeviceMultiDrawPropertiesEXT'::@maxMultiDrawCount@
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-drawCount-04940# If @drawCount@ is
--     greater than zero, @pIndexInfo@ /must/ be a valid pointer to memory
--     containing one or more valid instances of 'MultiDrawIndexedInfoEXT'
--     structures
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-stride-04941# @stride@ must be a
--     multiple of 4
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-commandBuffer-parameter#
--     @commandBuffer@ /must/ be a valid
--     'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-pVertexOffset-parameter# If
--     @pVertexOffset@ is not @NULL@, @pVertexOffset@ /must/ be a valid
--     pointer to a valid @int32_t@ value
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-commandBuffer-recording#
--     @commandBuffer@ /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-commandBuffer-cmdpool# The
--     'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   #VUID-vkCmdDrawMultiIndexedEXT-renderpass# This command /must/ only
--     be called inside of a render pass instance
--
-- == 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> |
-- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+
-- | Primary                                                                                                                    | Inside                                                                                                                 | Graphics                                                                                                              |
-- | Secondary                                                                                                                  |                                                                                                                        |                                                                                                                       |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_multi_draw VK_EXT_multi_draw>,
-- 'Vulkan.Core10.Handles.CommandBuffer', 'MultiDrawIndexedInfoEXT'
cmdDrawMultiIndexedEXT :: forall io
                        . (MonadIO io)
                       => -- | @commandBuffer@ is the command buffer into which the command is
                          -- recorded.
                          CommandBuffer
                       -> -- | @pIndexInfo@ is a pointer to an array of 'MultiDrawIndexedInfoEXT' with
                          -- index information to be drawn.
                          ("indexInfo" ::: Vector MultiDrawIndexedInfoEXT)
                       -> -- | @instanceCount@ is the number of instances to draw.
                          ("instanceCount" ::: Word32)
                       -> -- | @firstInstance@ is the instance ID of the first instance to draw.
                          ("firstInstance" ::: Word32)
                       -> -- | @stride@ is the byte stride between consecutive elements of
                          -- @pIndexInfo@.
                          ("stride" ::: Word32)
                       -> -- | @pVertexOffset@ is @NULL@ or a pointer to the value added to the vertex
                          -- index before indexing into the vertex buffer. When specified,
                          -- 'MultiDrawIndexedInfoEXT'::@offset@ is ignored.
                          ("vertexOffset" ::: Maybe Int32)
                       -> io ()
cmdDrawMultiIndexedEXT :: CommandBuffer
-> ("indexInfo" ::: Vector MultiDrawIndexedInfoEXT)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> ("vertexOffset" ::: Maybe Int32)
-> io ()
cmdDrawMultiIndexedEXT CommandBuffer
commandBuffer "indexInfo" ::: Vector MultiDrawIndexedInfoEXT
indexInfo "instanceCount" ::: Word32
instanceCount "instanceCount" ::: Word32
firstInstance "instanceCount" ::: Word32
stride "vertexOffset" ::: Maybe Int32
vertexOffset = 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 vkCmdDrawMultiIndexedEXTPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> ("instanceCount" ::: Word32)
   -> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("pVertexOffset" ::: Ptr Int32)
   -> IO ())
vkCmdDrawMultiIndexedEXTPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("instanceCount" ::: Word32)
      -> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
      -> ("instanceCount" ::: Word32)
      -> ("instanceCount" ::: Word32)
      -> ("instanceCount" ::: Word32)
      -> ("pVertexOffset" ::: Ptr Int32)
      -> IO ())
pVkCmdDrawMultiIndexedEXT (case CommandBuffer
commandBuffer of CommandBuffer{DeviceCmds
deviceCmds :: DeviceCmds
$sel:deviceCmds:CommandBuffer :: CommandBuffer -> DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  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
   -> ("instanceCount" ::: Word32)
   -> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("pVertexOffset" ::: Ptr Int32)
   -> IO ())
vkCmdDrawMultiIndexedEXTPtr FunPtr
  (Ptr CommandBuffer_T
   -> ("instanceCount" ::: Word32)
   -> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("pVertexOffset" ::: Ptr Int32)
   -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("instanceCount" ::: Word32)
      -> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
      -> ("instanceCount" ::: Word32)
      -> ("instanceCount" ::: Word32)
      -> ("instanceCount" ::: Word32)
      -> ("pVertexOffset" ::: Ptr Int32)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> ("instanceCount" ::: Word32)
   -> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("pVertexOffset" ::: Ptr Int32)
   -> 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 String
"" String
"The function pointer for vkCmdDrawMultiIndexedEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdDrawMultiIndexedEXT' :: Ptr CommandBuffer_T
-> ("instanceCount" ::: Word32)
-> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> ("pVertexOffset" ::: Ptr Int32)
-> IO ()
vkCmdDrawMultiIndexedEXT' = FunPtr
  (Ptr CommandBuffer_T
   -> ("instanceCount" ::: Word32)
   -> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("pVertexOffset" ::: Ptr Int32)
   -> IO ())
-> Ptr CommandBuffer_T
-> ("instanceCount" ::: Word32)
-> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> ("pVertexOffset" ::: Ptr Int32)
-> IO ()
mkVkCmdDrawMultiIndexedEXT FunPtr
  (Ptr CommandBuffer_T
   -> ("instanceCount" ::: Word32)
   -> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("instanceCount" ::: Word32)
   -> ("pVertexOffset" ::: Ptr Int32)
   -> IO ())
vkCmdDrawMultiIndexedEXTPtr
  "pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
pPIndexInfo <- ((("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT) -> IO ())
 -> IO ())
-> ContT () IO ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT) -> IO ())
  -> IO ())
 -> ContT () IO ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT))
-> ((("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT) -> IO ())
    -> IO ())
-> ContT () IO ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
forall a b. (a -> b) -> a -> b
$ Int
-> (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT) -> IO ())
-> IO ()
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes @MultiDrawIndexedInfoEXT ((("indexInfo" ::: Vector MultiDrawIndexedInfoEXT) -> Int
forall a. Vector a -> Int
Data.Vector.length ("indexInfo" ::: Vector MultiDrawIndexedInfoEXT
indexInfo)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
12)
  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 -> MultiDrawIndexedInfoEXT -> IO ())
-> ("indexInfo" ::: Vector MultiDrawIndexedInfoEXT) -> IO ()
forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\Int
i MultiDrawIndexedInfoEXT
e -> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> MultiDrawIndexedInfoEXT -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
pPIndexInfo ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> Int -> "pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
12 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr MultiDrawIndexedInfoEXT) (MultiDrawIndexedInfoEXT
e)) ("indexInfo" ::: Vector MultiDrawIndexedInfoEXT
indexInfo)
  "pVertexOffset" ::: Ptr Int32
pVertexOffset <- case ("vertexOffset" ::: Maybe Int32
vertexOffset) of
    "vertexOffset" ::: Maybe Int32
Nothing -> ("pVertexOffset" ::: Ptr Int32)
-> ContT () IO ("pVertexOffset" ::: Ptr Int32)
forall (f :: * -> *) a. Applicative f => a -> f a
pure "pVertexOffset" ::: Ptr Int32
forall a. Ptr a
nullPtr
    Just Int32
j -> ((("pVertexOffset" ::: Ptr Int32) -> IO ()) -> IO ())
-> ContT () IO ("pVertexOffset" ::: Ptr Int32)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((("pVertexOffset" ::: Ptr Int32) -> IO ()) -> IO ())
 -> ContT () IO ("pVertexOffset" ::: Ptr Int32))
-> ((("pVertexOffset" ::: Ptr Int32) -> IO ()) -> IO ())
-> ContT () IO ("pVertexOffset" ::: Ptr Int32)
forall a b. (a -> b) -> a -> b
$ Int32 -> (("pVertexOffset" ::: Ptr Int32) -> IO ()) -> IO ()
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with (Int32
j)
  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
$ String -> IO () -> IO ()
forall a. String -> IO a -> IO a
traceAroundEvent String
"vkCmdDrawMultiIndexedEXT" (Ptr CommandBuffer_T
-> ("instanceCount" ::: Word32)
-> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32)
-> ("pVertexOffset" ::: Ptr Int32)
-> IO ()
vkCmdDrawMultiIndexedEXT' (CommandBuffer -> Ptr CommandBuffer_T
commandBufferHandle (CommandBuffer
commandBuffer)) ((Int -> "instanceCount" ::: Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (("indexInfo" ::: Vector MultiDrawIndexedInfoEXT) -> Int
forall a. Vector a -> Int
Data.Vector.length (("indexInfo" ::: Vector MultiDrawIndexedInfoEXT) -> Int)
-> ("indexInfo" ::: Vector MultiDrawIndexedInfoEXT) -> Int
forall a b. (a -> b) -> a -> b
$ ("indexInfo" ::: Vector MultiDrawIndexedInfoEXT
indexInfo)) :: Word32)) ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
pPIndexInfo) ("instanceCount" ::: Word32
instanceCount) ("instanceCount" ::: Word32
firstInstance) ("instanceCount" ::: Word32
stride) "pVertexOffset" ::: Ptr Int32
pVertexOffset)
  () -> ContT () IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> ContT () IO ()) -> () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ ()


-- | VkMultiDrawInfoEXT - Structure specifying a multi-draw command
--
-- = Description
--
-- The members of 'MultiDrawInfoEXT' have the same meaning as the
-- @firstVertex@ and @vertexCount@ parameters in
-- 'Vulkan.Core10.CommandBufferBuilding.cmdDraw'.
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_multi_draw VK_EXT_multi_draw>,
-- 'cmdDrawMultiEXT'
data MultiDrawInfoEXT = MultiDrawInfoEXT
  { -- | @firstVertex@ is the first vertex to draw.
    MultiDrawInfoEXT -> "instanceCount" ::: Word32
firstVertex :: Word32
  , -- | @vertexCount@ is the number of vertices to draw.
    MultiDrawInfoEXT -> "instanceCount" ::: Word32
vertexCount :: Word32
  }
  deriving (Typeable, MultiDrawInfoEXT -> MultiDrawInfoEXT -> Bool
(MultiDrawInfoEXT -> MultiDrawInfoEXT -> Bool)
-> (MultiDrawInfoEXT -> MultiDrawInfoEXT -> Bool)
-> Eq MultiDrawInfoEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MultiDrawInfoEXT -> MultiDrawInfoEXT -> Bool
$c/= :: MultiDrawInfoEXT -> MultiDrawInfoEXT -> Bool
== :: MultiDrawInfoEXT -> MultiDrawInfoEXT -> Bool
$c== :: MultiDrawInfoEXT -> MultiDrawInfoEXT -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (MultiDrawInfoEXT)
#endif
deriving instance Show MultiDrawInfoEXT

instance ToCStruct MultiDrawInfoEXT where
  withCStruct :: MultiDrawInfoEXT
-> (("pVertexInfo" ::: Ptr MultiDrawInfoEXT) -> IO b) -> IO b
withCStruct MultiDrawInfoEXT
x ("pVertexInfo" ::: Ptr MultiDrawInfoEXT) -> IO b
f = Int -> (("pVertexInfo" ::: Ptr MultiDrawInfoEXT) -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
8 ((("pVertexInfo" ::: Ptr MultiDrawInfoEXT) -> IO b) -> IO b)
-> (("pVertexInfo" ::: Ptr MultiDrawInfoEXT) -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \"pVertexInfo" ::: Ptr MultiDrawInfoEXT
p -> ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> MultiDrawInfoEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct "pVertexInfo" ::: Ptr MultiDrawInfoEXT
p MultiDrawInfoEXT
x (("pVertexInfo" ::: Ptr MultiDrawInfoEXT) -> IO b
f "pVertexInfo" ::: Ptr MultiDrawInfoEXT
p)
  pokeCStruct :: ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> MultiDrawInfoEXT -> IO b -> IO b
pokeCStruct "pVertexInfo" ::: Ptr MultiDrawInfoEXT
p MultiDrawInfoEXT{"instanceCount" ::: Word32
vertexCount :: "instanceCount" ::: Word32
firstVertex :: "instanceCount" ::: Word32
$sel:vertexCount:MultiDrawInfoEXT :: MultiDrawInfoEXT -> "instanceCount" ::: Word32
$sel:firstVertex:MultiDrawInfoEXT :: MultiDrawInfoEXT -> "instanceCount" ::: Word32
..} IO b
f = do
    Ptr ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pVertexInfo" ::: Ptr MultiDrawInfoEXT
p ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr Word32)) ("instanceCount" ::: Word32
firstVertex)
    Ptr ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pVertexInfo" ::: Ptr MultiDrawInfoEXT
p ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4 :: Ptr Word32)) ("instanceCount" ::: Word32
vertexCount)
    IO b
f
  cStructSize :: Int
cStructSize = Int
8
  cStructAlignment :: Int
cStructAlignment = Int
4
  pokeZeroCStruct :: ("pVertexInfo" ::: Ptr MultiDrawInfoEXT) -> IO b -> IO b
pokeZeroCStruct "pVertexInfo" ::: Ptr MultiDrawInfoEXT
p IO b
f = do
    Ptr ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pVertexInfo" ::: Ptr MultiDrawInfoEXT
p ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr Word32)) ("instanceCount" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pVertexInfo" ::: Ptr MultiDrawInfoEXT
p ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4 :: Ptr Word32)) ("instanceCount" ::: Word32
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct MultiDrawInfoEXT where
  peekCStruct :: ("pVertexInfo" ::: Ptr MultiDrawInfoEXT) -> IO MultiDrawInfoEXT
peekCStruct "pVertexInfo" ::: Ptr MultiDrawInfoEXT
p = do
    "instanceCount" ::: Word32
firstVertex <- Ptr ("instanceCount" ::: Word32) -> IO ("instanceCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 (("pVertexInfo" ::: Ptr MultiDrawInfoEXT
p ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr Word32))
    "instanceCount" ::: Word32
vertexCount <- Ptr ("instanceCount" ::: Word32) -> IO ("instanceCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 (("pVertexInfo" ::: Ptr MultiDrawInfoEXT
p ("pVertexInfo" ::: Ptr MultiDrawInfoEXT)
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4 :: Ptr Word32))
    MultiDrawInfoEXT -> IO MultiDrawInfoEXT
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MultiDrawInfoEXT -> IO MultiDrawInfoEXT)
-> MultiDrawInfoEXT -> IO MultiDrawInfoEXT
forall a b. (a -> b) -> a -> b
$ ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> MultiDrawInfoEXT
MultiDrawInfoEXT
             "instanceCount" ::: Word32
firstVertex "instanceCount" ::: Word32
vertexCount

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

instance Zero MultiDrawInfoEXT where
  zero :: MultiDrawInfoEXT
zero = ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> MultiDrawInfoEXT
MultiDrawInfoEXT
           "instanceCount" ::: Word32
forall a. Zero a => a
zero
           "instanceCount" ::: Word32
forall a. Zero a => a
zero


-- | VkMultiDrawIndexedInfoEXT - Structure specifying a multi-draw command
--
-- = Description
--
-- The @firstIndex@, @indexCount@, and @vertexOffset@ members of
-- 'MultiDrawIndexedInfoEXT' have the same meaning as the @firstIndex@,
-- @indexCount@, and @vertexOffset@ parameters, respectively, of
-- 'Vulkan.Core10.CommandBufferBuilding.cmdDrawIndexed'.
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_multi_draw VK_EXT_multi_draw>,
-- 'cmdDrawMultiIndexedEXT'
data MultiDrawIndexedInfoEXT = MultiDrawIndexedInfoEXT
  { -- | @firstIndex@ is the first index to draw.
    MultiDrawIndexedInfoEXT -> "instanceCount" ::: Word32
firstIndex :: Word32
  , -- | @indexCount@ is the number of vertices to draw.
    MultiDrawIndexedInfoEXT -> "instanceCount" ::: Word32
indexCount :: Word32
  , -- | @vertexOffset@ is the value added to the vertex index before indexing
    -- into the vertex buffer for indexed multidraws.
    MultiDrawIndexedInfoEXT -> Int32
vertexOffset :: Int32
  }
  deriving (Typeable, MultiDrawIndexedInfoEXT -> MultiDrawIndexedInfoEXT -> Bool
(MultiDrawIndexedInfoEXT -> MultiDrawIndexedInfoEXT -> Bool)
-> (MultiDrawIndexedInfoEXT -> MultiDrawIndexedInfoEXT -> Bool)
-> Eq MultiDrawIndexedInfoEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MultiDrawIndexedInfoEXT -> MultiDrawIndexedInfoEXT -> Bool
$c/= :: MultiDrawIndexedInfoEXT -> MultiDrawIndexedInfoEXT -> Bool
== :: MultiDrawIndexedInfoEXT -> MultiDrawIndexedInfoEXT -> Bool
$c== :: MultiDrawIndexedInfoEXT -> MultiDrawIndexedInfoEXT -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (MultiDrawIndexedInfoEXT)
#endif
deriving instance Show MultiDrawIndexedInfoEXT

instance ToCStruct MultiDrawIndexedInfoEXT where
  withCStruct :: MultiDrawIndexedInfoEXT
-> (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT) -> IO b) -> IO b
withCStruct MultiDrawIndexedInfoEXT
x ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT) -> IO b
f = Int
-> (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT) -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
12 ((("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT) -> IO b) -> IO b)
-> (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT) -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \"pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p -> ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> MultiDrawIndexedInfoEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct "pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p MultiDrawIndexedInfoEXT
x (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT) -> IO b
f "pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p)
  pokeCStruct :: ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> MultiDrawIndexedInfoEXT -> IO b -> IO b
pokeCStruct "pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p MultiDrawIndexedInfoEXT{Int32
"instanceCount" ::: Word32
vertexOffset :: Int32
indexCount :: "instanceCount" ::: Word32
firstIndex :: "instanceCount" ::: Word32
$sel:vertexOffset:MultiDrawIndexedInfoEXT :: MultiDrawIndexedInfoEXT -> Int32
$sel:indexCount:MultiDrawIndexedInfoEXT :: MultiDrawIndexedInfoEXT -> "instanceCount" ::: Word32
$sel:firstIndex:MultiDrawIndexedInfoEXT :: MultiDrawIndexedInfoEXT -> "instanceCount" ::: Word32
..} IO b
f = do
    Ptr ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr Word32)) ("instanceCount" ::: Word32
firstIndex)
    Ptr ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4 :: Ptr Word32)) ("instanceCount" ::: Word32
indexCount)
    ("pVertexOffset" ::: Ptr Int32) -> Int32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> Int -> "pVertexOffset" ::: Ptr Int32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr Int32)) (Int32
vertexOffset)
    IO b
f
  cStructSize :: Int
cStructSize = Int
12
  cStructAlignment :: Int
cStructAlignment = Int
4
  pokeZeroCStruct :: ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT) -> IO b -> IO b
pokeZeroCStruct "pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p IO b
f = do
    Ptr ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr Word32)) ("instanceCount" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4 :: Ptr Word32)) ("instanceCount" ::: Word32
forall a. Zero a => a
zero)
    ("pVertexOffset" ::: Ptr Int32) -> Int32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> Int -> "pVertexOffset" ::: Ptr Int32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr Int32)) (Int32
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct MultiDrawIndexedInfoEXT where
  peekCStruct :: ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> IO MultiDrawIndexedInfoEXT
peekCStruct "pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p = do
    "instanceCount" ::: Word32
firstIndex <- Ptr ("instanceCount" ::: Word32) -> IO ("instanceCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr Word32))
    "instanceCount" ::: Word32
indexCount <- Ptr ("instanceCount" ::: Word32) -> IO ("instanceCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4 :: Ptr Word32))
    Int32
vertexOffset <- ("pVertexOffset" ::: Ptr Int32) -> IO Int32
forall a. Storable a => Ptr a -> IO a
peek @Int32 (("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT
p ("pIndexInfo" ::: Ptr MultiDrawIndexedInfoEXT)
-> Int -> "pVertexOffset" ::: Ptr Int32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr Int32))
    MultiDrawIndexedInfoEXT -> IO MultiDrawIndexedInfoEXT
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MultiDrawIndexedInfoEXT -> IO MultiDrawIndexedInfoEXT)
-> MultiDrawIndexedInfoEXT -> IO MultiDrawIndexedInfoEXT
forall a b. (a -> b) -> a -> b
$ ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> Int32 -> MultiDrawIndexedInfoEXT
MultiDrawIndexedInfoEXT
             "instanceCount" ::: Word32
firstIndex "instanceCount" ::: Word32
indexCount Int32
vertexOffset

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

instance Zero MultiDrawIndexedInfoEXT where
  zero :: MultiDrawIndexedInfoEXT
zero = ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> Int32 -> MultiDrawIndexedInfoEXT
MultiDrawIndexedInfoEXT
           "instanceCount" ::: Word32
forall a. Zero a => a
zero
           "instanceCount" ::: Word32
forall a. Zero a => a
zero
           Int32
forall a. Zero a => a
zero


-- | VkPhysicalDeviceMultiDrawPropertiesEXT - Structure describing multidraw
-- limits of an implementation
--
-- = Members
--
-- The members of the 'PhysicalDeviceMultiDrawPropertiesEXT' structure
-- describe the following features:
--
-- = Description
--
-- If the @VkPhysicalDeviceMultiDrawPropertiesPropertiesEXT@ structure is
-- included in the @pNext@ chain of the
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2'
-- structure passed to
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceProperties2',
-- it is filled in with each corresponding implementation-dependent
-- property.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_multi_draw VK_EXT_multi_draw>,
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceMultiDrawPropertiesEXT = PhysicalDeviceMultiDrawPropertiesEXT
  { -- | #limits-maxMultiDrawCount# @maxMultiDrawCount@ indicates the maximum
    -- number of draw calls which /can/ be batched into a single multidraw.
    PhysicalDeviceMultiDrawPropertiesEXT -> "instanceCount" ::: Word32
maxMultiDrawCount :: Word32 }
  deriving (Typeable, PhysicalDeviceMultiDrawPropertiesEXT
-> PhysicalDeviceMultiDrawPropertiesEXT -> Bool
(PhysicalDeviceMultiDrawPropertiesEXT
 -> PhysicalDeviceMultiDrawPropertiesEXT -> Bool)
-> (PhysicalDeviceMultiDrawPropertiesEXT
    -> PhysicalDeviceMultiDrawPropertiesEXT -> Bool)
-> Eq PhysicalDeviceMultiDrawPropertiesEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PhysicalDeviceMultiDrawPropertiesEXT
-> PhysicalDeviceMultiDrawPropertiesEXT -> Bool
$c/= :: PhysicalDeviceMultiDrawPropertiesEXT
-> PhysicalDeviceMultiDrawPropertiesEXT -> Bool
== :: PhysicalDeviceMultiDrawPropertiesEXT
-> PhysicalDeviceMultiDrawPropertiesEXT -> Bool
$c== :: PhysicalDeviceMultiDrawPropertiesEXT
-> PhysicalDeviceMultiDrawPropertiesEXT -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceMultiDrawPropertiesEXT)
#endif
deriving instance Show PhysicalDeviceMultiDrawPropertiesEXT

instance ToCStruct PhysicalDeviceMultiDrawPropertiesEXT where
  withCStruct :: PhysicalDeviceMultiDrawPropertiesEXT
-> (Ptr PhysicalDeviceMultiDrawPropertiesEXT -> IO b) -> IO b
withCStruct PhysicalDeviceMultiDrawPropertiesEXT
x Ptr PhysicalDeviceMultiDrawPropertiesEXT -> IO b
f = Int -> (Ptr PhysicalDeviceMultiDrawPropertiesEXT -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
24 ((Ptr PhysicalDeviceMultiDrawPropertiesEXT -> IO b) -> IO b)
-> (Ptr PhysicalDeviceMultiDrawPropertiesEXT -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr PhysicalDeviceMultiDrawPropertiesEXT
p -> Ptr PhysicalDeviceMultiDrawPropertiesEXT
-> PhysicalDeviceMultiDrawPropertiesEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceMultiDrawPropertiesEXT
p PhysicalDeviceMultiDrawPropertiesEXT
x (Ptr PhysicalDeviceMultiDrawPropertiesEXT -> IO b
f Ptr PhysicalDeviceMultiDrawPropertiesEXT
p)
  pokeCStruct :: Ptr PhysicalDeviceMultiDrawPropertiesEXT
-> PhysicalDeviceMultiDrawPropertiesEXT -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceMultiDrawPropertiesEXT
p PhysicalDeviceMultiDrawPropertiesEXT{"instanceCount" ::: Word32
maxMultiDrawCount :: "instanceCount" ::: Word32
$sel:maxMultiDrawCount:PhysicalDeviceMultiDrawPropertiesEXT :: PhysicalDeviceMultiDrawPropertiesEXT -> "instanceCount" ::: Word32
..} IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMultiDrawPropertiesEXT
p Ptr PhysicalDeviceMultiDrawPropertiesEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMultiDrawPropertiesEXT
p Ptr PhysicalDeviceMultiDrawPropertiesEXT -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMultiDrawPropertiesEXT
p Ptr PhysicalDeviceMultiDrawPropertiesEXT
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Word32)) ("instanceCount" ::: Word32
maxMultiDrawCount)
    IO b
f
  cStructSize :: Int
cStructSize = Int
24
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: Ptr PhysicalDeviceMultiDrawPropertiesEXT -> IO b -> IO b
pokeZeroCStruct Ptr PhysicalDeviceMultiDrawPropertiesEXT
p IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMultiDrawPropertiesEXT
p Ptr PhysicalDeviceMultiDrawPropertiesEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMultiDrawPropertiesEXT
p Ptr PhysicalDeviceMultiDrawPropertiesEXT -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr ("instanceCount" ::: Word32)
-> ("instanceCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMultiDrawPropertiesEXT
p Ptr PhysicalDeviceMultiDrawPropertiesEXT
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Word32)) ("instanceCount" ::: Word32
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct PhysicalDeviceMultiDrawPropertiesEXT where
  peekCStruct :: Ptr PhysicalDeviceMultiDrawPropertiesEXT
-> IO PhysicalDeviceMultiDrawPropertiesEXT
peekCStruct Ptr PhysicalDeviceMultiDrawPropertiesEXT
p = do
    "instanceCount" ::: Word32
maxMultiDrawCount <- Ptr ("instanceCount" ::: Word32) -> IO ("instanceCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceMultiDrawPropertiesEXT
p Ptr PhysicalDeviceMultiDrawPropertiesEXT
-> Int -> Ptr ("instanceCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Word32))
    PhysicalDeviceMultiDrawPropertiesEXT
-> IO PhysicalDeviceMultiDrawPropertiesEXT
forall (f :: * -> *) a. Applicative f => a -> f a
pure (PhysicalDeviceMultiDrawPropertiesEXT
 -> IO PhysicalDeviceMultiDrawPropertiesEXT)
-> PhysicalDeviceMultiDrawPropertiesEXT
-> IO PhysicalDeviceMultiDrawPropertiesEXT
forall a b. (a -> b) -> a -> b
$ ("instanceCount" ::: Word32)
-> PhysicalDeviceMultiDrawPropertiesEXT
PhysicalDeviceMultiDrawPropertiesEXT
             "instanceCount" ::: Word32
maxMultiDrawCount

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

instance Zero PhysicalDeviceMultiDrawPropertiesEXT where
  zero :: PhysicalDeviceMultiDrawPropertiesEXT
zero = ("instanceCount" ::: Word32)
-> PhysicalDeviceMultiDrawPropertiesEXT
PhysicalDeviceMultiDrawPropertiesEXT
           "instanceCount" ::: Word32
forall a. Zero a => a
zero


-- | VkPhysicalDeviceMultiDrawFeaturesEXT - Structure describing whether the
-- implementation supports multi draw functionality
--
-- = Members
--
-- The members of the 'PhysicalDeviceMultiDrawFeaturesEXT' structure
-- describe the following features:
--
-- = Description
--
-- If the 'PhysicalDeviceMultiDrawFeaturesEXT' structure is included in the
-- @pNext@ chain of the
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2'
-- structure passed to
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceFeatures2',
-- it is filled in to indicate whether each corresponding feature is
-- supported. 'PhysicalDeviceMultiDrawFeaturesEXT' /can/ also be used in
-- the @pNext@ chain of 'Vulkan.Core10.Device.DeviceCreateInfo' to
-- selectively enable these features.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_multi_draw VK_EXT_multi_draw>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceMultiDrawFeaturesEXT = PhysicalDeviceMultiDrawFeaturesEXT
  { -- | #features-multiDraw# @multiDraw@ indicates that the implementation
    -- supports 'cmdDrawMultiEXT' and 'cmdDrawMultiIndexedEXT'.
    PhysicalDeviceMultiDrawFeaturesEXT -> Bool
multiDraw :: Bool }
  deriving (Typeable, PhysicalDeviceMultiDrawFeaturesEXT
-> PhysicalDeviceMultiDrawFeaturesEXT -> Bool
(PhysicalDeviceMultiDrawFeaturesEXT
 -> PhysicalDeviceMultiDrawFeaturesEXT -> Bool)
-> (PhysicalDeviceMultiDrawFeaturesEXT
    -> PhysicalDeviceMultiDrawFeaturesEXT -> Bool)
-> Eq PhysicalDeviceMultiDrawFeaturesEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PhysicalDeviceMultiDrawFeaturesEXT
-> PhysicalDeviceMultiDrawFeaturesEXT -> Bool
$c/= :: PhysicalDeviceMultiDrawFeaturesEXT
-> PhysicalDeviceMultiDrawFeaturesEXT -> Bool
== :: PhysicalDeviceMultiDrawFeaturesEXT
-> PhysicalDeviceMultiDrawFeaturesEXT -> Bool
$c== :: PhysicalDeviceMultiDrawFeaturesEXT
-> PhysicalDeviceMultiDrawFeaturesEXT -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceMultiDrawFeaturesEXT)
#endif
deriving instance Show PhysicalDeviceMultiDrawFeaturesEXT

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

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

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

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


type EXT_MULTI_DRAW_SPEC_VERSION = 1

-- No documentation found for TopLevel "VK_EXT_MULTI_DRAW_SPEC_VERSION"
pattern EXT_MULTI_DRAW_SPEC_VERSION :: forall a . Integral a => a
pattern $bEXT_MULTI_DRAW_SPEC_VERSION :: a
$mEXT_MULTI_DRAW_SPEC_VERSION :: forall r a. Integral a => a -> (Void# -> r) -> (Void# -> r) -> r
EXT_MULTI_DRAW_SPEC_VERSION = 1


type EXT_MULTI_DRAW_EXTENSION_NAME = "VK_EXT_multi_draw"

-- No documentation found for TopLevel "VK_EXT_MULTI_DRAW_EXTENSION_NAME"
pattern EXT_MULTI_DRAW_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $bEXT_MULTI_DRAW_EXTENSION_NAME :: a
$mEXT_MULTI_DRAW_EXTENSION_NAME :: forall r a.
(Eq a, IsString a) =>
a -> (Void# -> r) -> (Void# -> r) -> r
EXT_MULTI_DRAW_EXTENSION_NAME = "VK_EXT_multi_draw"