{-# language CPP #-}
module Vulkan.Extensions.VK_NV_mesh_shader  ( cmdDrawMeshTasksNV
                                            , cmdDrawMeshTasksIndirectNV
                                            , cmdDrawMeshTasksIndirectCountNV
                                            , PhysicalDeviceMeshShaderFeaturesNV(..)
                                            , PhysicalDeviceMeshShaderPropertiesNV(..)
                                            , DrawMeshTasksIndirectCommandNV(..)
                                            , NV_MESH_SHADER_SPEC_VERSION
                                            , pattern NV_MESH_SHADER_SPEC_VERSION
                                            , NV_MESH_SHADER_EXTENSION_NAME
                                            , pattern NV_MESH_SHADER_EXTENSION_NAME
                                            ) where

import Vulkan.CStruct.Utils (FixedArray)
import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Foreign.Marshal.Alloc (allocaBytesAligned)
import GHC.IO (throwIO)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import 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.IO.Exception (IOErrorType(..))
import GHC.IO.Exception (IOException(..))
import Foreign.Ptr (FunPtr)
import Foreign.Ptr (Ptr)
import Data.Word (Word32)
import Data.Kind (Type)
import Vulkan.CStruct.Utils (advancePtrBytes)
import Vulkan.Core10.BaseType (bool32ToBool)
import Vulkan.Core10.BaseType (boolToBool32)
import Vulkan.CStruct.Utils (lowerArrayPtr)
import Vulkan.NamedType ((:::))
import Vulkan.Core10.BaseType (Bool32)
import Vulkan.Core10.Handles (Buffer)
import Vulkan.Core10.Handles (Buffer(..))
import Vulkan.Core10.Handles (CommandBuffer)
import Vulkan.Core10.Handles (CommandBuffer(..))
import Vulkan.Core10.Handles (CommandBuffer_T)
import Vulkan.Dynamic (DeviceCmds(pVkCmdDrawMeshTasksIndirectCountNV))
import Vulkan.Dynamic (DeviceCmds(pVkCmdDrawMeshTasksIndirectNV))
import Vulkan.Dynamic (DeviceCmds(pVkCmdDrawMeshTasksNV))
import Vulkan.Core10.BaseType (DeviceSize)
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Zero (Zero(..))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCmdDrawMeshTasksNV
  :: FunPtr (Ptr CommandBuffer_T -> Word32 -> Word32 -> IO ()) -> Ptr CommandBuffer_T -> Word32 -> Word32 -> IO ()

-- | vkCmdDrawMeshTasksNV - Draw mesh task work items
--
-- = Parameters
--
-- -   @commandBuffer@ is the command buffer into which the command will be
--     recorded.
--
-- -   @taskCount@ is the number of local workgroups to dispatch in the X
--     dimension. Y and Z dimension are implicitly set to one.
--
-- -   @firstTask@ is the X component of the first workgroup ID.
--
-- = Description
--
-- When the command is executed, a global workgroup consisting of
-- @taskCount@ local workgroups is assembled.
--
-- == Valid Usage
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is sampled with
--     'Vulkan.Core10.Enums.Filter.FILTER_LINEAR' as a result of this
--     command, then the image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     /must/ contain
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT'
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is accessed using atomic
--     operations as a result of this command, then the image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     /must/ contain
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT'
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is sampled with
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' as a result
--     of this command, then the image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     /must/ contain
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT'
--
-- -   Any 'Vulkan.Core10.Handles.ImageView' being sampled with
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' as a result
--     of this command /must/ have a
--     'Vulkan.Core10.Enums.ImageViewType.ImageViewType' and format that
--     supports cubic filtering, as specified by
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FilterCubicImageViewImageFormatPropertiesEXT'::@filterCubic@
--     returned by
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2'
--
-- -   Any 'Vulkan.Core10.Handles.ImageView' being sampled with
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' with a
--     reduction mode of either
--     'Vulkan.Core12.Enums.SamplerReductionMode.SAMPLER_REDUCTION_MODE_MIN'
--     or
--     'Vulkan.Core12.Enums.SamplerReductionMode.SAMPLER_REDUCTION_MODE_MAX'
--     as a result of this command /must/ have a
--     'Vulkan.Core10.Enums.ImageViewType.ImageViewType' and format that
--     supports cubic filtering together with minmax filtering, as
--     specified by
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FilterCubicImageViewImageFormatPropertiesEXT'::@filterCubicMinmax@
--     returned by
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2'
--
-- -   Any 'Vulkan.Core10.Handles.Image' created with a
--     'Vulkan.Core10.Image.ImageCreateInfo'::@flags@ containing
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CORNER_SAMPLED_BIT_NV'
--     sampled as a result of this command /must/ only be sampled using a
--     'Vulkan.Core10.Enums.SamplerAddressMode.SamplerAddressMode' of
--     'Vulkan.Core10.Enums.SamplerAddressMode.SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE'
--
-- -   For each set /n/ that is statically used by the
--     'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind point
--     used by this command, a descriptor set /must/ have been bound to /n/
--     at the same pipeline bind point, with a
--     'Vulkan.Core10.Handles.PipelineLayout' that is compatible for set
--     /n/, with the 'Vulkan.Core10.Handles.PipelineLayout' used to create
--     the current 'Vulkan.Core10.Handles.Pipeline', as described in
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorsets-compatibility ???>
--
-- -   For each push constant that is statically used by the
--     'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind point
--     used by this command, a push constant value /must/ have been set for
--     the same pipeline bind point, with a
--     'Vulkan.Core10.Handles.PipelineLayout' that is compatible for push
--     constants, with the 'Vulkan.Core10.Handles.PipelineLayout' used to
--     create the current 'Vulkan.Core10.Handles.Pipeline', as described in
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorsets-compatibility ???>
--
-- -   Descriptors in each bound descriptor set, specified via
--     'Vulkan.Core10.CommandBufferBuilding.cmdBindDescriptorSets', /must/
--     be valid if they are statically used by the
--     'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind point
--     used by this command
--
-- -   A valid pipeline /must/ be bound to the pipeline bind point used by
--     this command
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command requires any dynamic state, that
--     state /must/ have been set for @commandBuffer@, and done so after
--     any previously bound pipeline with the corresponding state not
--     specified as dynamic
--
-- -   There /must/ not have been any calls to dynamic state setting
--     commands for any state not specified as dynamic in the
--     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
--     point used by this command, since that pipeline was bound
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command accesses a
--     'Vulkan.Core10.Handles.Sampler' object that uses unnormalized
--     coordinates, that sampler /must/ not be used to sample from any
--     'Vulkan.Core10.Handles.Image' with a
--     'Vulkan.Core10.Handles.ImageView' of the type
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_3D',
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_CUBE',
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_1D_ARRAY',
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_2D_ARRAY' or
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_CUBE_ARRAY', in
--     any shader stage
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command accesses a
--     'Vulkan.Core10.Handles.Sampler' object that uses unnormalized
--     coordinates, that sampler /must/ not be used with any of the SPIR-V
--     @OpImageSample*@ or @OpImageSparseSample*@ instructions with
--     @ImplicitLod@, @Dref@ or @Proj@ in their name, in any shader stage
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command accesses a
--     'Vulkan.Core10.Handles.Sampler' object that uses unnormalized
--     coordinates, that sampler /must/ not be used with any of the SPIR-V
--     @OpImageSample*@ or @OpImageSparseSample*@ instructions that
--     includes a LOD bias or any offset values, in any shader stage
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-robustBufferAccess robust buffer access>
--     feature is not enabled, and if the 'Vulkan.Core10.Handles.Pipeline'
--     object bound to the pipeline bind point used by this command
--     accesses a uniform buffer, it /must/ not access values outside of
--     the range of the buffer as specified in the descriptor set bound to
--     the same pipeline bind point
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-robustBufferAccess robust buffer access>
--     feature is not enabled, and if the 'Vulkan.Core10.Handles.Pipeline'
--     object bound to the pipeline bind point used by this command
--     accesses a storage buffer, it /must/ not access values outside of
--     the range of the buffer as specified in the descriptor set bound to
--     the same pipeline bind point
--
-- -   If @commandBuffer@ is an unprotected command buffer, any resource
--     accessed by the 'Vulkan.Core10.Handles.Pipeline' object bound to the
--     pipeline bind point used by this command /must/ not be a protected
--     resource
--
-- -   The current render pass /must/ be
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#renderpass-compatibility compatible>
--     with the @renderPass@ member of the
--     'Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo' structure
--     specified when creating the 'Vulkan.Core10.Handles.Pipeline' bound
--     to
--     'Vulkan.Core10.Enums.PipelineBindPoint.PIPELINE_BIND_POINT_GRAPHICS'
--
-- -   The subpass index of the current render pass /must/ be equal to the
--     @subpass@ member of the
--     'Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo' structure
--     specified when creating the 'Vulkan.Core10.Handles.Pipeline' bound
--     to
--     'Vulkan.Core10.Enums.PipelineBindPoint.PIPELINE_BIND_POINT_GRAPHICS'
--
-- -   Every input attachment used by the current subpass /must/ be bound
--     to the pipeline via a descriptor set
--
-- -   Image subresources used as attachments in the current render pass
--     /must/ not be accessed in any way other than as an attachment by
--     this command
--
-- -   If the draw is recorded in a render pass instance with multiview
--     enabled, the maximum instance index /must/ be less than or equal to
--     'Vulkan.Core11.Promoted_From_VK_KHR_multiview.PhysicalDeviceMultiviewProperties'::@maxMultiviewInstanceIndex@
--
-- -   If the bound graphics pipeline was created with
--     'Vulkan.Extensions.VK_EXT_sample_locations.PipelineSampleLocationsStateCreateInfoEXT'::@sampleLocationsEnable@
--     set to 'Vulkan.Core10.BaseType.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
--
-- -   @taskCount@ /must/ be less than or equal to
--     'PhysicalDeviceMeshShaderPropertiesNV'::@maxDrawMeshTasksCount@
--
-- == Valid Usage (Implicit)
--
-- -   @commandBuffer@ /must/ be a valid
--     'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   @commandBuffer@ /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   The 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   This command /must/ only be called inside of a render pass instance
--
-- == Host Synchronization
--
-- -   Host access to @commandBuffer@ /must/ be externally synchronized
--
-- -   Host access to the 'Vulkan.Core10.Handles.CommandPool' that
--     @commandBuffer@ was allocated from /must/ be externally synchronized
--
-- == Command Properties
--
-- \'
--
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
-- | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkCommandBufferLevel Command Buffer Levels> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdBeginRenderPass Render Pass Scope> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkQueueFlagBits Supported Queue Types> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#synchronization-pipeline-stages-types Pipeline Type> |
-- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+=====================================================================================================================================+
-- | Primary                                                                                                                    | Inside                                                                                                                 | Graphics                                                                                                              | Graphics                                                                                                                            |
-- | Secondary                                                                                                                  |                                                                                                                        |                                                                                                                       |                                                                                                                                     |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.CommandBuffer'
cmdDrawMeshTasksNV :: forall io . MonadIO io => CommandBuffer -> ("taskCount" ::: Word32) -> ("firstTask" ::: Word32) -> io ()
cmdDrawMeshTasksNV :: CommandBuffer
-> ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> io ()
cmdDrawMeshTasksNV commandBuffer :: CommandBuffer
commandBuffer taskCount :: "taskCount" ::: Word32
taskCount firstTask :: "taskCount" ::: Word32
firstTask = IO () -> io ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ()) -> IO () -> io ()
forall a b. (a -> b) -> a -> b
$ do
  let vkCmdDrawMeshTasksNVPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ())
vkCmdDrawMeshTasksNVPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ())
pVkCmdDrawMeshTasksNV (CommandBuffer -> DeviceCmds
deviceCmds (CommandBuffer
commandBuffer :: CommandBuffer))
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr CommandBuffer_T
   -> ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ())
vkCmdDrawMeshTasksNVPtr FunPtr
  (Ptr CommandBuffer_T
   -> ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "The function pointer for vkCmdDrawMeshTasksNV is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdDrawMeshTasksNV' :: Ptr CommandBuffer_T
-> ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
vkCmdDrawMeshTasksNV' = FunPtr
  (Ptr CommandBuffer_T
   -> ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ())
-> Ptr CommandBuffer_T
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> IO ()
mkVkCmdDrawMeshTasksNV FunPtr
  (Ptr CommandBuffer_T
   -> ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ())
vkCmdDrawMeshTasksNVPtr
  Ptr CommandBuffer_T
-> ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
vkCmdDrawMeshTasksNV' (CommandBuffer -> Ptr CommandBuffer_T
commandBufferHandle (CommandBuffer
commandBuffer)) ("taskCount" ::: Word32
taskCount) ("taskCount" ::: Word32
firstTask)
  () -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> IO ()) -> () -> IO ()
forall a b. (a -> b) -> a -> b
$ ()


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

-- | vkCmdDrawMeshTasksIndirectNV - Issue an indirect mesh tasks draw into a
-- command buffer
--
-- = Parameters
--
-- -   @commandBuffer@ is the command buffer into which the command is
--     recorded.
--
-- -   @buffer@ is the buffer containing draw parameters.
--
-- -   @offset@ is the byte offset into @buffer@ where parameters begin.
--
-- -   @drawCount@ is the number of draws to execute, and /can/ be zero.
--
-- -   @stride@ is the byte stride between successive sets of draw
--     parameters.
--
-- = Description
--
-- 'cmdDrawMeshTasksIndirectNV' behaves similarly to 'cmdDrawMeshTasksNV'
-- except that the parameters are read by the device from a buffer during
-- execution. @drawCount@ draws are executed by the command, with
-- parameters taken from @buffer@ starting at @offset@ and increasing by
-- @stride@ bytes for each successive draw. The parameters of each draw are
-- encoded in an array of 'DrawMeshTasksIndirectCommandNV' structures. If
-- @drawCount@ is less than or equal to one, @stride@ is ignored.
--
-- == Valid Usage
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is sampled with
--     'Vulkan.Core10.Enums.Filter.FILTER_LINEAR' as a result of this
--     command, then the image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     /must/ contain
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT'
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is accessed using atomic
--     operations as a result of this command, then the image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     /must/ contain
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT'
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is sampled with
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' as a result
--     of this command, then the image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     /must/ contain
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT'
--
-- -   Any 'Vulkan.Core10.Handles.ImageView' being sampled with
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' as a result
--     of this command /must/ have a
--     'Vulkan.Core10.Enums.ImageViewType.ImageViewType' and format that
--     supports cubic filtering, as specified by
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FilterCubicImageViewImageFormatPropertiesEXT'::@filterCubic@
--     returned by
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2'
--
-- -   Any 'Vulkan.Core10.Handles.ImageView' being sampled with
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' with a
--     reduction mode of either
--     'Vulkan.Core12.Enums.SamplerReductionMode.SAMPLER_REDUCTION_MODE_MIN'
--     or
--     'Vulkan.Core12.Enums.SamplerReductionMode.SAMPLER_REDUCTION_MODE_MAX'
--     as a result of this command /must/ have a
--     'Vulkan.Core10.Enums.ImageViewType.ImageViewType' and format that
--     supports cubic filtering together with minmax filtering, as
--     specified by
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FilterCubicImageViewImageFormatPropertiesEXT'::@filterCubicMinmax@
--     returned by
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2'
--
-- -   Any 'Vulkan.Core10.Handles.Image' created with a
--     'Vulkan.Core10.Image.ImageCreateInfo'::@flags@ containing
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CORNER_SAMPLED_BIT_NV'
--     sampled as a result of this command /must/ only be sampled using a
--     'Vulkan.Core10.Enums.SamplerAddressMode.SamplerAddressMode' of
--     'Vulkan.Core10.Enums.SamplerAddressMode.SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE'
--
-- -   For each set /n/ that is statically used by the
--     'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind point
--     used by this command, a descriptor set /must/ have been bound to /n/
--     at the same pipeline bind point, with a
--     'Vulkan.Core10.Handles.PipelineLayout' that is compatible for set
--     /n/, with the 'Vulkan.Core10.Handles.PipelineLayout' used to create
--     the current 'Vulkan.Core10.Handles.Pipeline', as described in
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorsets-compatibility ???>
--
-- -   For each push constant that is statically used by the
--     'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind point
--     used by this command, a push constant value /must/ have been set for
--     the same pipeline bind point, with a
--     'Vulkan.Core10.Handles.PipelineLayout' that is compatible for push
--     constants, with the 'Vulkan.Core10.Handles.PipelineLayout' used to
--     create the current 'Vulkan.Core10.Handles.Pipeline', as described in
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorsets-compatibility ???>
--
-- -   Descriptors in each bound descriptor set, specified via
--     'Vulkan.Core10.CommandBufferBuilding.cmdBindDescriptorSets', /must/
--     be valid if they are statically used by the
--     'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind point
--     used by this command
--
-- -   A valid pipeline /must/ be bound to the pipeline bind point used by
--     this command
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command requires any dynamic state, that
--     state /must/ have been set for @commandBuffer@, and done so after
--     any previously bound pipeline with the corresponding state not
--     specified as dynamic
--
-- -   There /must/ not have been any calls to dynamic state setting
--     commands for any state not specified as dynamic in the
--     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
--     point used by this command, since that pipeline was bound
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command accesses a
--     'Vulkan.Core10.Handles.Sampler' object that uses unnormalized
--     coordinates, that sampler /must/ not be used to sample from any
--     'Vulkan.Core10.Handles.Image' with a
--     'Vulkan.Core10.Handles.ImageView' of the type
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_3D',
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_CUBE',
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_1D_ARRAY',
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_2D_ARRAY' or
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_CUBE_ARRAY', in
--     any shader stage
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command accesses a
--     'Vulkan.Core10.Handles.Sampler' object that uses unnormalized
--     coordinates, that sampler /must/ not be used with any of the SPIR-V
--     @OpImageSample*@ or @OpImageSparseSample*@ instructions with
--     @ImplicitLod@, @Dref@ or @Proj@ in their name, in any shader stage
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command accesses a
--     'Vulkan.Core10.Handles.Sampler' object that uses unnormalized
--     coordinates, that sampler /must/ not be used with any of the SPIR-V
--     @OpImageSample*@ or @OpImageSparseSample*@ instructions that
--     includes a LOD bias or any offset values, in any shader stage
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-robustBufferAccess robust buffer access>
--     feature is not enabled, and if the 'Vulkan.Core10.Handles.Pipeline'
--     object bound to the pipeline bind point used by this command
--     accesses a uniform buffer, it /must/ not access values outside of
--     the range of the buffer as specified in the descriptor set bound to
--     the same pipeline bind point
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-robustBufferAccess robust buffer access>
--     feature is not enabled, and if the 'Vulkan.Core10.Handles.Pipeline'
--     object bound to the pipeline bind point used by this command
--     accesses a storage buffer, it /must/ not access values outside of
--     the range of the buffer as specified in the descriptor set bound to
--     the same pipeline bind point
--
-- -   If @commandBuffer@ is an unprotected command buffer, any resource
--     accessed by the 'Vulkan.Core10.Handles.Pipeline' object bound to the
--     pipeline bind point used by this command /must/ not be a protected
--     resource
--
-- -   The current render pass /must/ be
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#renderpass-compatibility compatible>
--     with the @renderPass@ member of the
--     'Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo' structure
--     specified when creating the 'Vulkan.Core10.Handles.Pipeline' bound
--     to
--     'Vulkan.Core10.Enums.PipelineBindPoint.PIPELINE_BIND_POINT_GRAPHICS'
--
-- -   The subpass index of the current render pass /must/ be equal to the
--     @subpass@ member of the
--     'Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo' structure
--     specified when creating the 'Vulkan.Core10.Handles.Pipeline' bound
--     to
--     'Vulkan.Core10.Enums.PipelineBindPoint.PIPELINE_BIND_POINT_GRAPHICS'
--
-- -   Every input attachment used by the current subpass /must/ be bound
--     to the pipeline via a descriptor set
--
-- -   Image subresources used as attachments in the current render pass
--     /must/ not be accessed in any way other than as an attachment by
--     this command
--
-- -   If the draw is recorded in a render pass instance with multiview
--     enabled, the maximum instance index /must/ be less than or equal to
--     'Vulkan.Core11.Promoted_From_VK_KHR_multiview.PhysicalDeviceMultiviewProperties'::@maxMultiviewInstanceIndex@
--
-- -   If the bound graphics pipeline was created with
--     'Vulkan.Extensions.VK_EXT_sample_locations.PipelineSampleLocationsStateCreateInfoEXT'::@sampleLocationsEnable@
--     set to 'Vulkan.Core10.BaseType.TRUE' and the current subpass has a
--     depth\/stencil attachment, then that attachment /must/ have been
--     created with the
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT'
--     bit set
--
-- -   If @buffer@ is non-sparse then it /must/ be bound completely and
--     contiguously to a single 'Vulkan.Core10.Handles.DeviceMemory' object
--
-- -   @buffer@ /must/ have been created with the
--     'Vulkan.Core10.Enums.BufferUsageFlagBits.BUFFER_USAGE_INDIRECT_BUFFER_BIT'
--     bit set
--
-- -   @offset@ /must/ be a multiple of @4@
--
-- -   @commandBuffer@ /must/ not be a protected command buffer
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-multiDrawIndirect multi-draw indirect>
--     feature is not enabled, @drawCount@ /must/ be @0@ or @1@
--
-- -   @drawCount@ /must/ be less than or equal to
--     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxDrawIndirectCount@
--
-- -   If @drawCount@ is greater than @1@, @stride@ /must/ be a multiple of
--     @4@ and /must/ be greater than or equal to
--     @sizeof@('DrawMeshTasksIndirectCommandNV')
--
-- -   If @drawCount@ is equal to @1@, (@offset@ +
--     @sizeof@('DrawMeshTasksIndirectCommandNV')) /must/ be less than or
--     equal to the size of @buffer@
--
-- -   If @drawCount@ is greater than @1@, (@stride@ × (@drawCount@ - 1) +
--     @offset@ + @sizeof@('DrawMeshTasksIndirectCommandNV')) /must/ be
--     less than or equal to the size of @buffer@
--
-- == Valid Usage (Implicit)
--
-- -   @commandBuffer@ /must/ be a valid
--     'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   @buffer@ /must/ be a valid 'Vulkan.Core10.Handles.Buffer' handle
--
-- -   @commandBuffer@ /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   The 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   This command /must/ only be called inside of a render pass instance
--
-- -   Both of @buffer@, and @commandBuffer@ /must/ have been created,
--     allocated, or retrieved from the same 'Vulkan.Core10.Handles.Device'
--
-- == Host Synchronization
--
-- -   Host access to @commandBuffer@ /must/ be externally synchronized
--
-- -   Host access to the 'Vulkan.Core10.Handles.CommandPool' that
--     @commandBuffer@ was allocated from /must/ be externally synchronized
--
-- == Command Properties
--
-- \'
--
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
-- | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkCommandBufferLevel Command Buffer Levels> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdBeginRenderPass Render Pass Scope> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkQueueFlagBits Supported Queue Types> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#synchronization-pipeline-stages-types Pipeline Type> |
-- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+=====================================================================================================================================+
-- | Primary                                                                                                                    | Inside                                                                                                                 | Graphics                                                                                                              | Graphics                                                                                                                            |
-- | Secondary                                                                                                                  |                                                                                                                        |                                                                                                                       |                                                                                                                                     |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.Buffer', 'Vulkan.Core10.Handles.CommandBuffer',
-- 'Vulkan.Core10.BaseType.DeviceSize'
cmdDrawMeshTasksIndirectNV :: forall io . MonadIO io => CommandBuffer -> Buffer -> ("offset" ::: DeviceSize) -> ("drawCount" ::: Word32) -> ("stride" ::: Word32) -> io ()
cmdDrawMeshTasksIndirectNV :: CommandBuffer
-> Buffer
-> ("offset" ::: DeviceSize)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> io ()
cmdDrawMeshTasksIndirectNV commandBuffer :: CommandBuffer
commandBuffer buffer :: Buffer
buffer offset :: "offset" ::: DeviceSize
offset drawCount :: "taskCount" ::: Word32
drawCount stride :: "taskCount" ::: Word32
stride = IO () -> io ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ()) -> IO () -> io ()
forall a b. (a -> b) -> a -> b
$ do
  let vkCmdDrawMeshTasksIndirectNVPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> ("taskCount" ::: Word32)
   -> ("taskCount" ::: Word32)
   -> IO ())
vkCmdDrawMeshTasksIndirectNVPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> Buffer
      -> ("offset" ::: DeviceSize)
      -> ("taskCount" ::: Word32)
      -> ("taskCount" ::: Word32)
      -> IO ())
pVkCmdDrawMeshTasksIndirectNV (CommandBuffer -> DeviceCmds
deviceCmds (CommandBuffer
commandBuffer :: CommandBuffer))
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr CommandBuffer_T
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> ("taskCount" ::: Word32)
   -> ("taskCount" ::: Word32)
   -> IO ())
vkCmdDrawMeshTasksIndirectNVPtr FunPtr
  (Ptr CommandBuffer_T
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> ("taskCount" ::: Word32)
   -> ("taskCount" ::: Word32)
   -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> Buffer
      -> ("offset" ::: DeviceSize)
      -> ("taskCount" ::: Word32)
      -> ("taskCount" ::: Word32)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> ("taskCount" ::: Word32)
   -> ("taskCount" ::: Word32)
   -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "The function pointer for vkCmdDrawMeshTasksIndirectNV is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdDrawMeshTasksIndirectNV' :: Ptr CommandBuffer_T
-> Buffer
-> ("offset" ::: DeviceSize)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> IO ()
vkCmdDrawMeshTasksIndirectNV' = FunPtr
  (Ptr CommandBuffer_T
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> ("taskCount" ::: Word32)
   -> ("taskCount" ::: Word32)
   -> IO ())
-> Ptr CommandBuffer_T
-> Buffer
-> ("offset" ::: DeviceSize)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> IO ()
mkVkCmdDrawMeshTasksIndirectNV FunPtr
  (Ptr CommandBuffer_T
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> ("taskCount" ::: Word32)
   -> ("taskCount" ::: Word32)
   -> IO ())
vkCmdDrawMeshTasksIndirectNVPtr
  Ptr CommandBuffer_T
-> Buffer
-> ("offset" ::: DeviceSize)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> IO ()
vkCmdDrawMeshTasksIndirectNV' (CommandBuffer -> Ptr CommandBuffer_T
commandBufferHandle (CommandBuffer
commandBuffer)) (Buffer
buffer) ("offset" ::: DeviceSize
offset) ("taskCount" ::: Word32
drawCount) ("taskCount" ::: Word32
stride)
  () -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> IO ()) -> () -> IO ()
forall a b. (a -> b) -> a -> b
$ ()


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

-- | vkCmdDrawMeshTasksIndirectCountNV - Perform an indirect mesh tasks draw
-- with the draw count sourced from a buffer
--
-- = Parameters
--
-- -   @commandBuffer@ is the command buffer into which the command is
--     recorded.
--
-- -   @buffer@ is the buffer containing draw parameters.
--
-- -   @offset@ is the byte offset into @buffer@ where parameters begin.
--
-- -   @countBuffer@ is the buffer containing the draw count.
--
-- -   @countBufferOffset@ is the byte offset into @countBuffer@ where the
--     draw count begins.
--
-- -   @maxDrawCount@ specifies the maximum number of draws that will be
--     executed. The actual number of executed draw calls is the minimum of
--     the count specified in @countBuffer@ and @maxDrawCount@.
--
-- -   @stride@ is the byte stride between successive sets of draw
--     parameters.
--
-- = Description
--
-- 'cmdDrawMeshTasksIndirectCountNV' behaves similarly to
-- 'cmdDrawMeshTasksIndirectNV' except that the draw count is read by the
-- device from a buffer during execution. The command will read an unsigned
-- 32-bit integer from @countBuffer@ located at @countBufferOffset@ and use
-- this as the draw count.
--
-- == Valid Usage
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is sampled with
--     'Vulkan.Core10.Enums.Filter.FILTER_LINEAR' as a result of this
--     command, then the image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     /must/ contain
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT'
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is accessed using atomic
--     operations as a result of this command, then the image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     /must/ contain
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT'
--
-- -   If a 'Vulkan.Core10.Handles.ImageView' is sampled with
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' as a result
--     of this command, then the image view’s
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features format features>
--     /must/ contain
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT'
--
-- -   Any 'Vulkan.Core10.Handles.ImageView' being sampled with
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' as a result
--     of this command /must/ have a
--     'Vulkan.Core10.Enums.ImageViewType.ImageViewType' and format that
--     supports cubic filtering, as specified by
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FilterCubicImageViewImageFormatPropertiesEXT'::@filterCubic@
--     returned by
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2'
--
-- -   Any 'Vulkan.Core10.Handles.ImageView' being sampled with
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' with a
--     reduction mode of either
--     'Vulkan.Core12.Enums.SamplerReductionMode.SAMPLER_REDUCTION_MODE_MIN'
--     or
--     'Vulkan.Core12.Enums.SamplerReductionMode.SAMPLER_REDUCTION_MODE_MAX'
--     as a result of this command /must/ have a
--     'Vulkan.Core10.Enums.ImageViewType.ImageViewType' and format that
--     supports cubic filtering together with minmax filtering, as
--     specified by
--     'Vulkan.Extensions.VK_EXT_filter_cubic.FilterCubicImageViewImageFormatPropertiesEXT'::@filterCubicMinmax@
--     returned by
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2'
--
-- -   Any 'Vulkan.Core10.Handles.Image' created with a
--     'Vulkan.Core10.Image.ImageCreateInfo'::@flags@ containing
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CORNER_SAMPLED_BIT_NV'
--     sampled as a result of this command /must/ only be sampled using a
--     'Vulkan.Core10.Enums.SamplerAddressMode.SamplerAddressMode' of
--     'Vulkan.Core10.Enums.SamplerAddressMode.SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE'
--
-- -   For each set /n/ that is statically used by the
--     'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind point
--     used by this command, a descriptor set /must/ have been bound to /n/
--     at the same pipeline bind point, with a
--     'Vulkan.Core10.Handles.PipelineLayout' that is compatible for set
--     /n/, with the 'Vulkan.Core10.Handles.PipelineLayout' used to create
--     the current 'Vulkan.Core10.Handles.Pipeline', as described in
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorsets-compatibility ???>
--
-- -   For each push constant that is statically used by the
--     'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind point
--     used by this command, a push constant value /must/ have been set for
--     the same pipeline bind point, with a
--     'Vulkan.Core10.Handles.PipelineLayout' that is compatible for push
--     constants, with the 'Vulkan.Core10.Handles.PipelineLayout' used to
--     create the current 'Vulkan.Core10.Handles.Pipeline', as described in
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorsets-compatibility ???>
--
-- -   Descriptors in each bound descriptor set, specified via
--     'Vulkan.Core10.CommandBufferBuilding.cmdBindDescriptorSets', /must/
--     be valid if they are statically used by the
--     'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind point
--     used by this command
--
-- -   A valid pipeline /must/ be bound to the pipeline bind point used by
--     this command
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command requires any dynamic state, that
--     state /must/ have been set for @commandBuffer@, and done so after
--     any previously bound pipeline with the corresponding state not
--     specified as dynamic
--
-- -   There /must/ not have been any calls to dynamic state setting
--     commands for any state not specified as dynamic in the
--     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
--     point used by this command, since that pipeline was bound
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command accesses a
--     'Vulkan.Core10.Handles.Sampler' object that uses unnormalized
--     coordinates, that sampler /must/ not be used to sample from any
--     'Vulkan.Core10.Handles.Image' with a
--     'Vulkan.Core10.Handles.ImageView' of the type
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_3D',
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_CUBE',
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_1D_ARRAY',
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_2D_ARRAY' or
--     'Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_CUBE_ARRAY', in
--     any shader stage
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command accesses a
--     'Vulkan.Core10.Handles.Sampler' object that uses unnormalized
--     coordinates, that sampler /must/ not be used with any of the SPIR-V
--     @OpImageSample*@ or @OpImageSparseSample*@ instructions with
--     @ImplicitLod@, @Dref@ or @Proj@ in their name, in any shader stage
--
-- -   If the 'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline
--     bind point used by this command accesses a
--     'Vulkan.Core10.Handles.Sampler' object that uses unnormalized
--     coordinates, that sampler /must/ not be used with any of the SPIR-V
--     @OpImageSample*@ or @OpImageSparseSample*@ instructions that
--     includes a LOD bias or any offset values, in any shader stage
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-robustBufferAccess robust buffer access>
--     feature is not enabled, and if the 'Vulkan.Core10.Handles.Pipeline'
--     object bound to the pipeline bind point used by this command
--     accesses a uniform buffer, it /must/ not access values outside of
--     the range of the buffer as specified in the descriptor set bound to
--     the same pipeline bind point
--
-- -   If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-robustBufferAccess robust buffer access>
--     feature is not enabled, and if the 'Vulkan.Core10.Handles.Pipeline'
--     object bound to the pipeline bind point used by this command
--     accesses a storage buffer, it /must/ not access values outside of
--     the range of the buffer as specified in the descriptor set bound to
--     the same pipeline bind point
--
-- -   If @commandBuffer@ is an unprotected command buffer, any resource
--     accessed by the 'Vulkan.Core10.Handles.Pipeline' object bound to the
--     pipeline bind point used by this command /must/ not be a protected
--     resource
--
-- -   The current render pass /must/ be
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#renderpass-compatibility compatible>
--     with the @renderPass@ member of the
--     'Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo' structure
--     specified when creating the 'Vulkan.Core10.Handles.Pipeline' bound
--     to
--     'Vulkan.Core10.Enums.PipelineBindPoint.PIPELINE_BIND_POINT_GRAPHICS'
--
-- -   The subpass index of the current render pass /must/ be equal to the
--     @subpass@ member of the
--     'Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo' structure
--     specified when creating the 'Vulkan.Core10.Handles.Pipeline' bound
--     to
--     'Vulkan.Core10.Enums.PipelineBindPoint.PIPELINE_BIND_POINT_GRAPHICS'
--
-- -   Every input attachment used by the current subpass /must/ be bound
--     to the pipeline via a descriptor set
--
-- -   Image subresources used as attachments in the current render pass
--     /must/ not be accessed in any way other than as an attachment by
--     this command
--
-- -   If the draw is recorded in a render pass instance with multiview
--     enabled, the maximum instance index /must/ be less than or equal to
--     'Vulkan.Core11.Promoted_From_VK_KHR_multiview.PhysicalDeviceMultiviewProperties'::@maxMultiviewInstanceIndex@
--
-- -   If the bound graphics pipeline was created with
--     'Vulkan.Extensions.VK_EXT_sample_locations.PipelineSampleLocationsStateCreateInfoEXT'::@sampleLocationsEnable@
--     set to 'Vulkan.Core10.BaseType.TRUE' and the current subpass has a
--     depth\/stencil attachment, then that attachment /must/ have been
--     created with the
--     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT'
--     bit set
--
-- -   If @buffer@ is non-sparse then it /must/ be bound completely and
--     contiguously to a single 'Vulkan.Core10.Handles.DeviceMemory' object
--
-- -   @buffer@ /must/ have been created with the
--     'Vulkan.Core10.Enums.BufferUsageFlagBits.BUFFER_USAGE_INDIRECT_BUFFER_BIT'
--     bit set
--
-- -   @offset@ /must/ be a multiple of @4@
--
-- -   @commandBuffer@ /must/ not be a protected command buffer
--
-- -   If @countBuffer@ is non-sparse then it /must/ be bound completely
--     and contiguously to a single 'Vulkan.Core10.Handles.DeviceMemory'
--     object
--
-- -   @countBuffer@ /must/ have been created with the
--     'Vulkan.Core10.Enums.BufferUsageFlagBits.BUFFER_USAGE_INDIRECT_BUFFER_BIT'
--     bit set
--
-- -   @countBufferOffset@ /must/ be a multiple of @4@
--
-- -   The count stored in @countBuffer@ /must/ be less than or equal to
--     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxDrawIndirectCount@
--
-- -   @stride@ /must/ be a multiple of @4@ and /must/ be greater than or
--     equal to @sizeof@('DrawMeshTasksIndirectCommandNV')
--
-- -   If @maxDrawCount@ is greater than or equal to @1@, (@stride@ ×
--     (@maxDrawCount@ - 1) + @offset@ +
--     @sizeof@('DrawMeshTasksIndirectCommandNV')) /must/ be less than or
--     equal to the size of @buffer@
--
-- -   If the count stored in @countBuffer@ is equal to @1@, (@offset@ +
--     @sizeof@('DrawMeshTasksIndirectCommandNV')) /must/ be less than or
--     equal to the size of @buffer@
--
-- -   If the count stored in @countBuffer@ is greater than @1@, (@stride@
--     × (@drawCount@ - 1) + @offset@ +
--     @sizeof@('DrawMeshTasksIndirectCommandNV')) /must/ be less than or
--     equal to the size of @buffer@
--
-- == Valid Usage (Implicit)
--
-- -   @commandBuffer@ /must/ be a valid
--     'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   @buffer@ /must/ be a valid 'Vulkan.Core10.Handles.Buffer' handle
--
-- -   @countBuffer@ /must/ be a valid 'Vulkan.Core10.Handles.Buffer'
--     handle
--
-- -   @commandBuffer@ /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   The 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   This command /must/ only be called inside of a render pass instance
--
-- -   Each of @buffer@, @commandBuffer@, and @countBuffer@ /must/ have
--     been created, allocated, or retrieved from the same
--     'Vulkan.Core10.Handles.Device'
--
-- == Host Synchronization
--
-- -   Host access to @commandBuffer@ /must/ be externally synchronized
--
-- -   Host access to the 'Vulkan.Core10.Handles.CommandPool' that
--     @commandBuffer@ was allocated from /must/ be externally synchronized
--
-- == Command Properties
--
-- \'
--
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
-- | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkCommandBufferLevel Command Buffer Levels> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdBeginRenderPass Render Pass Scope> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkQueueFlagBits Supported Queue Types> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#synchronization-pipeline-stages-types Pipeline Type> |
-- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+=====================================================================================================================================+
-- | Primary                                                                                                                    | Inside                                                                                                                 | Graphics                                                                                                              | Graphics                                                                                                                            |
-- | Secondary                                                                                                                  |                                                                                                                        |                                                                                                                       |                                                                                                                                     |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.Buffer', 'Vulkan.Core10.Handles.CommandBuffer',
-- 'Vulkan.Core10.BaseType.DeviceSize'
cmdDrawMeshTasksIndirectCountNV :: forall io . MonadIO io => CommandBuffer -> Buffer -> ("offset" ::: DeviceSize) -> ("countBuffer" ::: Buffer) -> ("countBufferOffset" ::: DeviceSize) -> ("maxDrawCount" ::: Word32) -> ("stride" ::: Word32) -> io ()
cmdDrawMeshTasksIndirectCountNV :: CommandBuffer
-> Buffer
-> ("offset" ::: DeviceSize)
-> Buffer
-> ("offset" ::: DeviceSize)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> io ()
cmdDrawMeshTasksIndirectCountNV commandBuffer :: CommandBuffer
commandBuffer buffer :: Buffer
buffer offset :: "offset" ::: DeviceSize
offset countBuffer :: Buffer
countBuffer countBufferOffset :: "offset" ::: DeviceSize
countBufferOffset maxDrawCount :: "taskCount" ::: Word32
maxDrawCount stride :: "taskCount" ::: Word32
stride = IO () -> io ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ()) -> IO () -> io ()
forall a b. (a -> b) -> a -> b
$ do
  let vkCmdDrawMeshTasksIndirectCountNVPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> ("taskCount" ::: Word32)
   -> ("taskCount" ::: Word32)
   -> IO ())
vkCmdDrawMeshTasksIndirectCountNVPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> Buffer
      -> ("offset" ::: DeviceSize)
      -> Buffer
      -> ("offset" ::: DeviceSize)
      -> ("taskCount" ::: Word32)
      -> ("taskCount" ::: Word32)
      -> IO ())
pVkCmdDrawMeshTasksIndirectCountNV (CommandBuffer -> DeviceCmds
deviceCmds (CommandBuffer
commandBuffer :: CommandBuffer))
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr CommandBuffer_T
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> ("taskCount" ::: Word32)
   -> ("taskCount" ::: Word32)
   -> IO ())
vkCmdDrawMeshTasksIndirectCountNVPtr FunPtr
  (Ptr CommandBuffer_T
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> ("taskCount" ::: Word32)
   -> ("taskCount" ::: Word32)
   -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> Buffer
      -> ("offset" ::: DeviceSize)
      -> Buffer
      -> ("offset" ::: DeviceSize)
      -> ("taskCount" ::: Word32)
      -> ("taskCount" ::: Word32)
      -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> ("taskCount" ::: Word32)
   -> ("taskCount" ::: Word32)
   -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "The function pointer for vkCmdDrawMeshTasksIndirectCountNV is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdDrawMeshTasksIndirectCountNV' :: Ptr CommandBuffer_T
-> Buffer
-> ("offset" ::: DeviceSize)
-> Buffer
-> ("offset" ::: DeviceSize)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> IO ()
vkCmdDrawMeshTasksIndirectCountNV' = FunPtr
  (Ptr CommandBuffer_T
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> ("taskCount" ::: Word32)
   -> ("taskCount" ::: Word32)
   -> IO ())
-> Ptr CommandBuffer_T
-> Buffer
-> ("offset" ::: DeviceSize)
-> Buffer
-> ("offset" ::: DeviceSize)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> IO ()
mkVkCmdDrawMeshTasksIndirectCountNV FunPtr
  (Ptr CommandBuffer_T
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> Buffer
   -> ("offset" ::: DeviceSize)
   -> ("taskCount" ::: Word32)
   -> ("taskCount" ::: Word32)
   -> IO ())
vkCmdDrawMeshTasksIndirectCountNVPtr
  Ptr CommandBuffer_T
-> Buffer
-> ("offset" ::: DeviceSize)
-> Buffer
-> ("offset" ::: DeviceSize)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> IO ()
vkCmdDrawMeshTasksIndirectCountNV' (CommandBuffer -> Ptr CommandBuffer_T
commandBufferHandle (CommandBuffer
commandBuffer)) (Buffer
buffer) ("offset" ::: DeviceSize
offset) (Buffer
countBuffer) ("offset" ::: DeviceSize
countBufferOffset) ("taskCount" ::: Word32
maxDrawCount) ("taskCount" ::: Word32
stride)
  () -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> IO ()) -> () -> IO ()
forall a b. (a -> b) -> a -> b
$ ()


-- | VkPhysicalDeviceMeshShaderFeaturesNV - Structure describing mesh shading
-- features that can be supported by an implementation
--
-- = Description
--
-- If the 'PhysicalDeviceMeshShaderFeaturesNV' structure is included in the
-- @pNext@ chain of
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
-- it is filled with a value indicating whether the feature is supported.
-- 'PhysicalDeviceMeshShaderFeaturesNV' /can/ also be included in @pNext@
-- chain of 'Vulkan.Core10.Device.DeviceCreateInfo' to enable the features.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- 'Vulkan.Core10.BaseType.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceMeshShaderFeaturesNV = PhysicalDeviceMeshShaderFeaturesNV
  { -- | @taskShader@ indicates whether the task shader stage is supported.
    PhysicalDeviceMeshShaderFeaturesNV -> Bool
taskShader :: Bool
  , -- | @meshShader@ indicates whether the mesh shader stage is supported.
    PhysicalDeviceMeshShaderFeaturesNV -> Bool
meshShader :: Bool
  }
  deriving (Typeable)
deriving instance Show PhysicalDeviceMeshShaderFeaturesNV

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

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

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

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


-- | VkPhysicalDeviceMeshShaderPropertiesNV - Structure describing mesh
-- shading properties
--
-- = Members
--
-- The members of the 'PhysicalDeviceMeshShaderPropertiesNV' structure
-- describe the following implementation-dependent limits:
--
-- = Description
--
-- If the 'PhysicalDeviceMeshShaderPropertiesNV' structure is included in
-- the @pNext@ chain of
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2',
-- it is filled with the implementation-dependent limits.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceMeshShaderPropertiesNV = PhysicalDeviceMeshShaderPropertiesNV
  { -- | @maxDrawMeshTasksCount@ is the maximum number of local workgroups that
    -- /can/ be launched by a single draw mesh tasks command. See
    -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#drawing-mesh-shading>.
    PhysicalDeviceMeshShaderPropertiesNV -> "taskCount" ::: Word32
maxDrawMeshTasksCount :: Word32
  , -- | @maxTaskWorkGroupInvocations@ is the maximum total number of task shader
    -- invocations in a single local workgroup. The product of the X, Y, and Z
    -- sizes, as specified by the @LocalSize@ execution mode in shader modules
    -- or by the object decorated by the @WorkgroupSize@ decoration, /must/ be
    -- less than or equal to this limit.
    PhysicalDeviceMeshShaderPropertiesNV -> "taskCount" ::: Word32
maxTaskWorkGroupInvocations :: Word32
  , -- | @maxTaskWorkGroupSize@[3] is the maximum size of a local task workgroup.
    -- These three values represent the maximum local workgroup size in the X,
    -- Y, and Z dimensions, respectively. The @x@, @y@, and @z@ sizes, as
    -- specified by the @LocalSize@ execution mode or by the object decorated
    -- by the @WorkgroupSize@ decoration in shader modules, /must/ be less than
    -- or equal to the corresponding limit.
    PhysicalDeviceMeshShaderPropertiesNV
-> ("taskCount" ::: Word32, "taskCount" ::: Word32,
    "taskCount" ::: Word32)
maxTaskWorkGroupSize :: (Word32, Word32, Word32)
  , -- | @maxTaskTotalMemorySize@ is the maximum number of bytes that the task
    -- shader can use in total for shared and output memory combined.
    PhysicalDeviceMeshShaderPropertiesNV -> "taskCount" ::: Word32
maxTaskTotalMemorySize :: Word32
  , -- | @maxTaskOutputCount@ is the maximum number of output tasks a single task
    -- shader workgroup can emit.
    PhysicalDeviceMeshShaderPropertiesNV -> "taskCount" ::: Word32
maxTaskOutputCount :: Word32
  , -- | @maxMeshWorkGroupInvocations@ is the maximum total number of mesh shader
    -- invocations in a single local workgroup. The product of the X, Y, and Z
    -- sizes, as specified by the @LocalSize@ execution mode in shader modules
    -- or by the object decorated by the @WorkgroupSize@ decoration, /must/ be
    -- less than or equal to this limit.
    PhysicalDeviceMeshShaderPropertiesNV -> "taskCount" ::: Word32
maxMeshWorkGroupInvocations :: Word32
  , -- | @maxMeshWorkGroupSize@[3] is the maximum size of a local mesh workgroup.
    -- These three values represent the maximum local workgroup size in the X,
    -- Y, and Z dimensions, respectively. The @x@, @y@, and @z@ sizes, as
    -- specified by the @LocalSize@ execution mode or by the object decorated
    -- by the @WorkgroupSize@ decoration in shader modules, /must/ be less than
    -- or equal to the corresponding limit.
    PhysicalDeviceMeshShaderPropertiesNV
-> ("taskCount" ::: Word32, "taskCount" ::: Word32,
    "taskCount" ::: Word32)
maxMeshWorkGroupSize :: (Word32, Word32, Word32)
  , -- | @maxMeshTotalMemorySize@ is the maximum number of bytes that the mesh
    -- shader can use in total for shared and output memory combined.
    PhysicalDeviceMeshShaderPropertiesNV -> "taskCount" ::: Word32
maxMeshTotalMemorySize :: Word32
  , -- | @maxMeshOutputVertices@ is the maximum number of vertices a mesh shader
    -- output can store.
    PhysicalDeviceMeshShaderPropertiesNV -> "taskCount" ::: Word32
maxMeshOutputVertices :: Word32
  , -- | @maxMeshOutputPrimitives@ is the maximum number of primitives a mesh
    -- shader output can store.
    PhysicalDeviceMeshShaderPropertiesNV -> "taskCount" ::: Word32
maxMeshOutputPrimitives :: Word32
  , -- | @maxMeshMultiviewViewCount@ is the maximum number of multi-view views a
    -- mesh shader can use.
    PhysicalDeviceMeshShaderPropertiesNV -> "taskCount" ::: Word32
maxMeshMultiviewViewCount :: Word32
  , -- | @meshOutputPerVertexGranularity@ is the granularity with which mesh
    -- vertex outputs are allocated. The value can be used to compute the
    -- memory size used by the mesh shader, which must be less than or equal to
    -- @maxMeshTotalMemorySize@.
    PhysicalDeviceMeshShaderPropertiesNV -> "taskCount" ::: Word32
meshOutputPerVertexGranularity :: Word32
  , -- | @meshOutputPerPrimitiveGranularity@ is the granularity with which mesh
    -- outputs qualified as per-primitive are allocated. The value can be used
    -- to compute the memory size used by the mesh shader, which must be less
    -- than or equal to @maxMeshTotalMemorySize@.
    PhysicalDeviceMeshShaderPropertiesNV -> "taskCount" ::: Word32
meshOutputPerPrimitiveGranularity :: Word32
  }
  deriving (Typeable)
deriving instance Show PhysicalDeviceMeshShaderPropertiesNV

instance ToCStruct PhysicalDeviceMeshShaderPropertiesNV where
  withCStruct :: PhysicalDeviceMeshShaderPropertiesNV
-> (Ptr PhysicalDeviceMeshShaderPropertiesNV -> IO b) -> IO b
withCStruct x :: PhysicalDeviceMeshShaderPropertiesNV
x f :: Ptr PhysicalDeviceMeshShaderPropertiesNV -> IO b
f = Int
-> Int
-> (Ptr PhysicalDeviceMeshShaderPropertiesNV -> IO b)
-> IO b
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned 88 8 ((Ptr PhysicalDeviceMeshShaderPropertiesNV -> IO b) -> IO b)
-> (Ptr PhysicalDeviceMeshShaderPropertiesNV -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \p :: Ptr PhysicalDeviceMeshShaderPropertiesNV
p -> Ptr PhysicalDeviceMeshShaderPropertiesNV
-> PhysicalDeviceMeshShaderPropertiesNV -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceMeshShaderPropertiesNV
p PhysicalDeviceMeshShaderPropertiesNV
x (Ptr PhysicalDeviceMeshShaderPropertiesNV -> IO b
f Ptr PhysicalDeviceMeshShaderPropertiesNV
p)
  pokeCStruct :: Ptr PhysicalDeviceMeshShaderPropertiesNV
-> PhysicalDeviceMeshShaderPropertiesNV -> IO b -> IO b
pokeCStruct p :: Ptr PhysicalDeviceMeshShaderPropertiesNV
p PhysicalDeviceMeshShaderPropertiesNV{..} f :: IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr Word32)) ("taskCount" ::: Word32
maxDrawMeshTasksCount)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 20 :: Ptr Word32)) ("taskCount" ::: Word32
maxTaskWorkGroupInvocations)
    let pMaxTaskWorkGroupSize' :: Ptr ("taskCount" ::: Word32)
pMaxTaskWorkGroupSize' = Ptr (FixedArray 3 ("taskCount" ::: Word32))
-> Ptr ("taskCount" ::: Word32)
forall a (n :: Nat). Ptr (FixedArray n a) -> Ptr a
lowerArrayPtr ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr (FixedArray 3 ("taskCount" ::: Word32))
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 24 :: Ptr (FixedArray 3 Word32)))
    case (("taskCount" ::: Word32, "taskCount" ::: Word32,
 "taskCount" ::: Word32)
maxTaskWorkGroupSize) of
      (e0 :: "taskCount" ::: Word32
e0, e1 :: "taskCount" ::: Word32
e1, e2 :: "taskCount" ::: Word32
e2) -> do
        Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ("taskCount" ::: Word32)
pMaxTaskWorkGroupSize' :: Ptr Word32) ("taskCount" ::: Word32
e0)
        Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ("taskCount" ::: Word32)
pMaxTaskWorkGroupSize' Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 4 :: Ptr Word32) ("taskCount" ::: Word32
e1)
        Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ("taskCount" ::: Word32)
pMaxTaskWorkGroupSize' Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr Word32) ("taskCount" ::: Word32
e2)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 36 :: Ptr Word32)) ("taskCount" ::: Word32
maxTaskTotalMemorySize)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 40 :: Ptr Word32)) ("taskCount" ::: Word32
maxTaskOutputCount)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 44 :: Ptr Word32)) ("taskCount" ::: Word32
maxMeshWorkGroupInvocations)
    let pMaxMeshWorkGroupSize' :: Ptr ("taskCount" ::: Word32)
pMaxMeshWorkGroupSize' = Ptr (FixedArray 3 ("taskCount" ::: Word32))
-> Ptr ("taskCount" ::: Word32)
forall a (n :: Nat). Ptr (FixedArray n a) -> Ptr a
lowerArrayPtr ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr (FixedArray 3 ("taskCount" ::: Word32))
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 48 :: Ptr (FixedArray 3 Word32)))
    case (("taskCount" ::: Word32, "taskCount" ::: Word32,
 "taskCount" ::: Word32)
maxMeshWorkGroupSize) of
      (e0 :: "taskCount" ::: Word32
e0, e1 :: "taskCount" ::: Word32
e1, e2 :: "taskCount" ::: Word32
e2) -> do
        Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ("taskCount" ::: Word32)
pMaxMeshWorkGroupSize' :: Ptr Word32) ("taskCount" ::: Word32
e0)
        Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ("taskCount" ::: Word32)
pMaxMeshWorkGroupSize' Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 4 :: Ptr Word32) ("taskCount" ::: Word32
e1)
        Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ("taskCount" ::: Word32)
pMaxMeshWorkGroupSize' Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr Word32) ("taskCount" ::: Word32
e2)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 60 :: Ptr Word32)) ("taskCount" ::: Word32
maxMeshTotalMemorySize)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 64 :: Ptr Word32)) ("taskCount" ::: Word32
maxMeshOutputVertices)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 68 :: Ptr Word32)) ("taskCount" ::: Word32
maxMeshOutputPrimitives)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 72 :: Ptr Word32)) ("taskCount" ::: Word32
maxMeshMultiviewViewCount)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 76 :: Ptr Word32)) ("taskCount" ::: Word32
meshOutputPerVertexGranularity)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 80 :: Ptr Word32)) ("taskCount" ::: Word32
meshOutputPerPrimitiveGranularity)
    IO b
f
  cStructSize :: Int
cStructSize = 88
  cStructAlignment :: Int
cStructAlignment = 8
  pokeZeroCStruct :: Ptr PhysicalDeviceMeshShaderPropertiesNV -> IO b -> IO b
pokeZeroCStruct p :: Ptr PhysicalDeviceMeshShaderPropertiesNV
p f :: IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 20 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    let pMaxTaskWorkGroupSize' :: Ptr ("taskCount" ::: Word32)
pMaxTaskWorkGroupSize' = Ptr (FixedArray 3 ("taskCount" ::: Word32))
-> Ptr ("taskCount" ::: Word32)
forall a (n :: Nat). Ptr (FixedArray n a) -> Ptr a
lowerArrayPtr ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr (FixedArray 3 ("taskCount" ::: Word32))
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 24 :: Ptr (FixedArray 3 Word32)))
    case (("taskCount" ::: Word32
forall a. Zero a => a
zero, "taskCount" ::: Word32
forall a. Zero a => a
zero, "taskCount" ::: Word32
forall a. Zero a => a
zero)) of
      (e0 :: "taskCount" ::: Word32
e0, e1 :: "taskCount" ::: Word32
e1, e2 :: "taskCount" ::: Word32
e2) -> do
        Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ("taskCount" ::: Word32)
pMaxTaskWorkGroupSize' :: Ptr Word32) ("taskCount" ::: Word32
e0)
        Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ("taskCount" ::: Word32)
pMaxTaskWorkGroupSize' Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 4 :: Ptr Word32) ("taskCount" ::: Word32
e1)
        Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ("taskCount" ::: Word32)
pMaxTaskWorkGroupSize' Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr Word32) ("taskCount" ::: Word32
e2)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 36 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 40 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 44 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    let pMaxMeshWorkGroupSize' :: Ptr ("taskCount" ::: Word32)
pMaxMeshWorkGroupSize' = Ptr (FixedArray 3 ("taskCount" ::: Word32))
-> Ptr ("taskCount" ::: Word32)
forall a (n :: Nat). Ptr (FixedArray n a) -> Ptr a
lowerArrayPtr ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr (FixedArray 3 ("taskCount" ::: Word32))
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 48 :: Ptr (FixedArray 3 Word32)))
    case (("taskCount" ::: Word32
forall a. Zero a => a
zero, "taskCount" ::: Word32
forall a. Zero a => a
zero, "taskCount" ::: Word32
forall a. Zero a => a
zero)) of
      (e0 :: "taskCount" ::: Word32
e0, e1 :: "taskCount" ::: Word32
e1, e2 :: "taskCount" ::: Word32
e2) -> do
        Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ("taskCount" ::: Word32)
pMaxMeshWorkGroupSize' :: Ptr Word32) ("taskCount" ::: Word32
e0)
        Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ("taskCount" ::: Word32)
pMaxMeshWorkGroupSize' Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 4 :: Ptr Word32) ("taskCount" ::: Word32
e1)
        Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ("taskCount" ::: Word32)
pMaxMeshWorkGroupSize' Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr Word32) ("taskCount" ::: Word32
e2)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 60 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 64 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 68 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 72 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 76 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 80 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct PhysicalDeviceMeshShaderPropertiesNV where
  peekCStruct :: Ptr PhysicalDeviceMeshShaderPropertiesNV
-> IO PhysicalDeviceMeshShaderPropertiesNV
peekCStruct p :: Ptr PhysicalDeviceMeshShaderPropertiesNV
p = do
    "taskCount" ::: Word32
maxDrawMeshTasksCount <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr Word32))
    "taskCount" ::: Word32
maxTaskWorkGroupInvocations <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 20 :: Ptr Word32))
    let pmaxTaskWorkGroupSize :: Ptr ("taskCount" ::: Word32)
pmaxTaskWorkGroupSize = Ptr (FixedArray 3 ("taskCount" ::: Word32))
-> Ptr ("taskCount" ::: Word32)
forall a (n :: Nat). Ptr (FixedArray n a) -> Ptr a
lowerArrayPtr @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr (FixedArray 3 ("taskCount" ::: Word32))
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 24 :: Ptr (FixedArray 3 Word32)))
    "taskCount" ::: Word32
maxTaskWorkGroupSize0 <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr ("taskCount" ::: Word32)
pmaxTaskWorkGroupSize Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` 0 :: Ptr Word32))
    "taskCount" ::: Word32
maxTaskWorkGroupSize1 <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr ("taskCount" ::: Word32)
pmaxTaskWorkGroupSize Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` 4 :: Ptr Word32))
    "taskCount" ::: Word32
maxTaskWorkGroupSize2 <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr ("taskCount" ::: Word32)
pmaxTaskWorkGroupSize Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` 8 :: Ptr Word32))
    "taskCount" ::: Word32
maxTaskTotalMemorySize <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 36 :: Ptr Word32))
    "taskCount" ::: Word32
maxTaskOutputCount <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 40 :: Ptr Word32))
    "taskCount" ::: Word32
maxMeshWorkGroupInvocations <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 44 :: Ptr Word32))
    let pmaxMeshWorkGroupSize :: Ptr ("taskCount" ::: Word32)
pmaxMeshWorkGroupSize = Ptr (FixedArray 3 ("taskCount" ::: Word32))
-> Ptr ("taskCount" ::: Word32)
forall a (n :: Nat). Ptr (FixedArray n a) -> Ptr a
lowerArrayPtr @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr (FixedArray 3 ("taskCount" ::: Word32))
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 48 :: Ptr (FixedArray 3 Word32)))
    "taskCount" ::: Word32
maxMeshWorkGroupSize0 <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr ("taskCount" ::: Word32)
pmaxMeshWorkGroupSize Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` 0 :: Ptr Word32))
    "taskCount" ::: Word32
maxMeshWorkGroupSize1 <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr ("taskCount" ::: Word32)
pmaxMeshWorkGroupSize Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` 4 :: Ptr Word32))
    "taskCount" ::: Word32
maxMeshWorkGroupSize2 <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr ("taskCount" ::: Word32)
pmaxMeshWorkGroupSize Ptr ("taskCount" ::: Word32) -> Int -> Ptr ("taskCount" ::: Word32)
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` 8 :: Ptr Word32))
    "taskCount" ::: Word32
maxMeshTotalMemorySize <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 60 :: Ptr Word32))
    "taskCount" ::: Word32
maxMeshOutputVertices <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 64 :: Ptr Word32))
    "taskCount" ::: Word32
maxMeshOutputPrimitives <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 68 :: Ptr Word32))
    "taskCount" ::: Word32
maxMeshMultiviewViewCount <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 72 :: Ptr Word32))
    "taskCount" ::: Word32
meshOutputPerVertexGranularity <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 76 :: Ptr Word32))
    "taskCount" ::: Word32
meshOutputPerPrimitiveGranularity <- Ptr ("taskCount" ::: Word32) -> IO ("taskCount" ::: Word32)
forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PhysicalDeviceMeshShaderPropertiesNV
p Ptr PhysicalDeviceMeshShaderPropertiesNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 80 :: Ptr Word32))
    PhysicalDeviceMeshShaderPropertiesNV
-> IO PhysicalDeviceMeshShaderPropertiesNV
forall (f :: * -> *) a. Applicative f => a -> f a
pure (PhysicalDeviceMeshShaderPropertiesNV
 -> IO PhysicalDeviceMeshShaderPropertiesNV)
-> PhysicalDeviceMeshShaderPropertiesNV
-> IO PhysicalDeviceMeshShaderPropertiesNV
forall a b. (a -> b) -> a -> b
$ ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32, "taskCount" ::: Word32,
    "taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32, "taskCount" ::: Word32,
    "taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> PhysicalDeviceMeshShaderPropertiesNV
PhysicalDeviceMeshShaderPropertiesNV
             "taskCount" ::: Word32
maxDrawMeshTasksCount "taskCount" ::: Word32
maxTaskWorkGroupInvocations (("taskCount" ::: Word32
maxTaskWorkGroupSize0, "taskCount" ::: Word32
maxTaskWorkGroupSize1, "taskCount" ::: Word32
maxTaskWorkGroupSize2)) "taskCount" ::: Word32
maxTaskTotalMemorySize "taskCount" ::: Word32
maxTaskOutputCount "taskCount" ::: Word32
maxMeshWorkGroupInvocations (("taskCount" ::: Word32
maxMeshWorkGroupSize0, "taskCount" ::: Word32
maxMeshWorkGroupSize1, "taskCount" ::: Word32
maxMeshWorkGroupSize2)) "taskCount" ::: Word32
maxMeshTotalMemorySize "taskCount" ::: Word32
maxMeshOutputVertices "taskCount" ::: Word32
maxMeshOutputPrimitives "taskCount" ::: Word32
maxMeshMultiviewViewCount "taskCount" ::: Word32
meshOutputPerVertexGranularity "taskCount" ::: Word32
meshOutputPerPrimitiveGranularity

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

instance Zero PhysicalDeviceMeshShaderPropertiesNV where
  zero :: PhysicalDeviceMeshShaderPropertiesNV
zero = ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32, "taskCount" ::: Word32,
    "taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32, "taskCount" ::: Word32,
    "taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32)
-> PhysicalDeviceMeshShaderPropertiesNV
PhysicalDeviceMeshShaderPropertiesNV
           "taskCount" ::: Word32
forall a. Zero a => a
zero
           "taskCount" ::: Word32
forall a. Zero a => a
zero
           ("taskCount" ::: Word32
forall a. Zero a => a
zero, "taskCount" ::: Word32
forall a. Zero a => a
zero, "taskCount" ::: Word32
forall a. Zero a => a
zero)
           "taskCount" ::: Word32
forall a. Zero a => a
zero
           "taskCount" ::: Word32
forall a. Zero a => a
zero
           "taskCount" ::: Word32
forall a. Zero a => a
zero
           ("taskCount" ::: Word32
forall a. Zero a => a
zero, "taskCount" ::: Word32
forall a. Zero a => a
zero, "taskCount" ::: Word32
forall a. Zero a => a
zero)
           "taskCount" ::: Word32
forall a. Zero a => a
zero
           "taskCount" ::: Word32
forall a. Zero a => a
zero
           "taskCount" ::: Word32
forall a. Zero a => a
zero
           "taskCount" ::: Word32
forall a. Zero a => a
zero
           "taskCount" ::: Word32
forall a. Zero a => a
zero
           "taskCount" ::: Word32
forall a. Zero a => a
zero


-- | VkDrawMeshTasksIndirectCommandNV - Structure specifying a mesh tasks
-- draw indirect command
--
-- = Description
--
-- The members of 'DrawMeshTasksIndirectCommandNV' have the same meaning as
-- the similarly named parameters of 'cmdDrawMeshTasksNV'.
--
-- == Valid Usage
--
-- = See Also
--
-- 'cmdDrawMeshTasksIndirectNV'
data DrawMeshTasksIndirectCommandNV = DrawMeshTasksIndirectCommandNV
  { -- | @taskCount@ /must/ be less than or equal to
    -- 'PhysicalDeviceMeshShaderPropertiesNV'::@maxDrawMeshTasksCount@
    DrawMeshTasksIndirectCommandNV -> "taskCount" ::: Word32
taskCount :: Word32
  , -- | @firstTask@ is the X component of the first workgroup ID.
    DrawMeshTasksIndirectCommandNV -> "taskCount" ::: Word32
firstTask :: Word32
  }
  deriving (Typeable)
deriving instance Show DrawMeshTasksIndirectCommandNV

instance ToCStruct DrawMeshTasksIndirectCommandNV where
  withCStruct :: DrawMeshTasksIndirectCommandNV
-> (Ptr DrawMeshTasksIndirectCommandNV -> IO b) -> IO b
withCStruct x :: DrawMeshTasksIndirectCommandNV
x f :: Ptr DrawMeshTasksIndirectCommandNV -> IO b
f = Int -> Int -> (Ptr DrawMeshTasksIndirectCommandNV -> IO b) -> IO b
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned 8 4 ((Ptr DrawMeshTasksIndirectCommandNV -> IO b) -> IO b)
-> (Ptr DrawMeshTasksIndirectCommandNV -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \p :: Ptr DrawMeshTasksIndirectCommandNV
p -> Ptr DrawMeshTasksIndirectCommandNV
-> DrawMeshTasksIndirectCommandNV -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr DrawMeshTasksIndirectCommandNV
p DrawMeshTasksIndirectCommandNV
x (Ptr DrawMeshTasksIndirectCommandNV -> IO b
f Ptr DrawMeshTasksIndirectCommandNV
p)
  pokeCStruct :: Ptr DrawMeshTasksIndirectCommandNV
-> DrawMeshTasksIndirectCommandNV -> IO b -> IO b
pokeCStruct p :: Ptr DrawMeshTasksIndirectCommandNV
p DrawMeshTasksIndirectCommandNV{..} f :: IO b
f = do
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DrawMeshTasksIndirectCommandNV
p Ptr DrawMeshTasksIndirectCommandNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr Word32)) ("taskCount" ::: Word32
taskCount)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DrawMeshTasksIndirectCommandNV
p Ptr DrawMeshTasksIndirectCommandNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 4 :: Ptr Word32)) ("taskCount" ::: Word32
firstTask)
    IO b
f
  cStructSize :: Int
cStructSize = 8
  cStructAlignment :: Int
cStructAlignment = 4
  pokeZeroCStruct :: Ptr DrawMeshTasksIndirectCommandNV -> IO b -> IO b
pokeZeroCStruct p :: Ptr DrawMeshTasksIndirectCommandNV
p f :: IO b
f = do
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DrawMeshTasksIndirectCommandNV
p Ptr DrawMeshTasksIndirectCommandNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    Ptr ("taskCount" ::: Word32) -> ("taskCount" ::: Word32) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DrawMeshTasksIndirectCommandNV
p Ptr DrawMeshTasksIndirectCommandNV
-> Int -> Ptr ("taskCount" ::: Word32)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 4 :: Ptr Word32)) ("taskCount" ::: Word32
forall a. Zero a => a
zero)
    IO b
f

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

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

instance Zero DrawMeshTasksIndirectCommandNV where
  zero :: DrawMeshTasksIndirectCommandNV
zero = ("taskCount" ::: Word32)
-> ("taskCount" ::: Word32) -> DrawMeshTasksIndirectCommandNV
DrawMeshTasksIndirectCommandNV
           "taskCount" ::: Word32
forall a. Zero a => a
zero
           "taskCount" ::: Word32
forall a. Zero a => a
zero


type NV_MESH_SHADER_SPEC_VERSION = 1

-- No documentation found for TopLevel "VK_NV_MESH_SHADER_SPEC_VERSION"
pattern NV_MESH_SHADER_SPEC_VERSION :: forall a . Integral a => a
pattern $bNV_MESH_SHADER_SPEC_VERSION :: a
$mNV_MESH_SHADER_SPEC_VERSION :: forall r a. Integral a => a -> (Void# -> r) -> (Void# -> r) -> r
NV_MESH_SHADER_SPEC_VERSION = 1


type NV_MESH_SHADER_EXTENSION_NAME = "VK_NV_mesh_shader"

-- No documentation found for TopLevel "VK_NV_MESH_SHADER_EXTENSION_NAME"
pattern NV_MESH_SHADER_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $bNV_MESH_SHADER_EXTENSION_NAME :: a
$mNV_MESH_SHADER_EXTENSION_NAME :: forall r a.
(Eq a, IsString a) =>
a -> (Void# -> r) -> (Void# -> r) -> r
NV_MESH_SHADER_EXTENSION_NAME = "VK_NV_mesh_shader"