{-# language CPP #-} module Graphics.Vulkan.Core12.Promoted_From_VK_KHR_draw_indirect_count ( cmdDrawIndirectCount , cmdDrawIndexedIndirectCount ) where import Control.Monad.IO.Class (liftIO) import Control.Monad.IO.Class (MonadIO) import Foreign.Ptr (FunPtr) import Foreign.Ptr (Ptr) import Data.Word (Word32) import Graphics.Vulkan.NamedType ((:::)) import Graphics.Vulkan.Core10.Handles (Buffer) import Graphics.Vulkan.Core10.Handles (Buffer(..)) import Graphics.Vulkan.Core10.Handles (CommandBuffer) import Graphics.Vulkan.Core10.Handles (CommandBuffer(..)) import Graphics.Vulkan.Core10.Handles (CommandBuffer_T) import Graphics.Vulkan.Dynamic (DeviceCmds(pVkCmdDrawIndexedIndirectCount)) import Graphics.Vulkan.Dynamic (DeviceCmds(pVkCmdDrawIndirectCount)) import Graphics.Vulkan.Core10.BaseType (DeviceSize) foreign import ccall #if !defined(SAFE_FOREIGN_CALLS) unsafe #endif "dynamic" mkVkCmdDrawIndirectCount :: FunPtr (Ptr CommandBuffer_T -> Buffer -> DeviceSize -> Buffer -> DeviceSize -> Word32 -> Word32 -> IO ()) -> Ptr CommandBuffer_T -> Buffer -> DeviceSize -> Buffer -> DeviceSize -> Word32 -> Word32 -> IO () -- | vkCmdDrawIndirectCount - Perform an indirect 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 -- -- 'cmdDrawIndirectCount' behaves similarly to -- 'Graphics.Vulkan.Core10.CommandBufferBuilding.cmdDrawIndirect' 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 'Graphics.Vulkan.Core10.Handles.ImageView' is sampled with -- 'Graphics.Vulkan.Core10.Enums.Filter.FILTER_LINEAR' as a result of -- this command, then the image view’s -- -- /must/ contain -- 'Graphics.Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT' -- -- - If a 'Graphics.Vulkan.Core10.Handles.ImageView' is accessed using -- atomic operations as a result of this command, then the image view’s -- -- /must/ contain -- 'Graphics.Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT' -- -- - If a 'Graphics.Vulkan.Core10.Handles.ImageView' is sampled with -- 'Graphics.Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' as -- a result of this command, then the image view’s -- -- /must/ contain -- 'Graphics.Vulkan.Extensions.VK_EXT_filter_cubic.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT' -- -- - Any 'Graphics.Vulkan.Core10.Handles.ImageView' being sampled with -- 'Graphics.Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' as -- a result of this command /must/ have a -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.ImageViewType' and -- format that supports cubic filtering, as specified by -- 'Graphics.Vulkan.Extensions.VK_EXT_filter_cubic.FilterCubicImageViewImageFormatPropertiesEXT'::@filterCubic@ -- returned by -- 'Graphics.Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2' -- -- - Any 'Graphics.Vulkan.Core10.Handles.ImageView' being sampled with -- 'Graphics.Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' -- with a reduction mode of either -- 'Graphics.Vulkan.Core12.Enums.SamplerReductionMode.SAMPLER_REDUCTION_MODE_MIN' -- or -- 'Graphics.Vulkan.Core12.Enums.SamplerReductionMode.SAMPLER_REDUCTION_MODE_MAX' -- as a result of this command /must/ have a -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.ImageViewType' and -- format that supports cubic filtering together with minmax filtering, -- as specified by -- 'Graphics.Vulkan.Extensions.VK_EXT_filter_cubic.FilterCubicImageViewImageFormatPropertiesEXT'::@filterCubicMinmax@ -- returned by -- 'Graphics.Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2' -- -- - Any 'Graphics.Vulkan.Core10.Handles.Image' created with a -- 'Graphics.Vulkan.Core10.Image.ImageCreateInfo'::@flags@ containing -- 'Graphics.Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CORNER_SAMPLED_BIT_NV' -- sampled as a result of this command /must/ only be sampled using a -- 'Graphics.Vulkan.Core10.Enums.SamplerAddressMode.SamplerAddressMode' -- of -- 'Graphics.Vulkan.Core10.Enums.SamplerAddressMode.SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE'. -- -- - For each set /n/ that is statically used by the -- 'Graphics.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 -- 'Graphics.Vulkan.Core10.Handles.PipelineLayout' that is compatible -- for set /n/, with the -- 'Graphics.Vulkan.Core10.Handles.PipelineLayout' used to create the -- current 'Graphics.Vulkan.Core10.Handles.Pipeline', as described in -- -- -- - For each push constant that is statically used by the -- 'Graphics.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 -- 'Graphics.Vulkan.Core10.Handles.PipelineLayout' that is compatible -- for push constants, with the -- 'Graphics.Vulkan.Core10.Handles.PipelineLayout' used to create the -- current 'Graphics.Vulkan.Core10.Handles.Pipeline', as described in -- -- -- - Descriptors in each bound descriptor set, specified via -- 'Graphics.Vulkan.Core10.CommandBufferBuilding.cmdBindDescriptorSets', -- /must/ be valid if they are statically used by the -- 'Graphics.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 'Graphics.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 -- 'Graphics.Vulkan.Core10.Handles.Pipeline' object bound to the -- pipeline bind point used by this command, since that pipeline was -- bound -- -- - If the 'Graphics.Vulkan.Core10.Handles.Pipeline' object bound to the -- pipeline bind point used by this command accesses a -- 'Graphics.Vulkan.Core10.Handles.Sampler' object that uses -- unnormalized coordinates, that sampler /must/ not be used to sample -- from any 'Graphics.Vulkan.Core10.Handles.Image' with a -- 'Graphics.Vulkan.Core10.Handles.ImageView' of the type -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_3D', -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_CUBE', -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_1D_ARRAY', -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_2D_ARRAY' -- or -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_CUBE_ARRAY', -- in any shader stage -- -- - If the 'Graphics.Vulkan.Core10.Handles.Pipeline' object bound to the -- pipeline bind point used by this command accesses a -- 'Graphics.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 'Graphics.Vulkan.Core10.Handles.Pipeline' object bound to the -- pipeline bind point used by this command accesses a -- 'Graphics.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 -- -- feature is not enabled, and if the -- 'Graphics.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 -- -- feature is not enabled, and if the -- 'Graphics.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 'Graphics.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 -- -- with the @renderPass@ member of the -- 'Graphics.Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo' -- structure specified when creating the -- 'Graphics.Vulkan.Core10.Handles.Pipeline' bound to -- 'Graphics.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 -- 'Graphics.Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo' -- structure specified when creating the -- 'Graphics.Vulkan.Core10.Handles.Pipeline' bound to -- 'Graphics.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 -- 'Graphics.Vulkan.Core11.Promoted_From_VK_KHR_multiview.PhysicalDeviceMultiviewProperties'::@maxMultiviewInstanceIndex@. -- -- - If the bound graphics pipeline was created with -- 'Graphics.Vulkan.Extensions.VK_EXT_sample_locations.PipelineSampleLocationsStateCreateInfoEXT'::@sampleLocationsEnable@ -- set to 'Graphics.Vulkan.Core10.BaseType.TRUE' and the current -- subpass has a depth\/stencil attachment, then that attachment /must/ -- have been created with the -- 'Graphics.Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT' -- bit set -- -- - All vertex input bindings accessed via vertex input variables -- declared in the vertex shader entry point’s interface /must/ have -- valid buffers bound -- -- - For a given vertex buffer binding, any attribute data fetched /must/ -- be entirely contained within the corresponding vertex buffer -- binding, as described in -- -- -- - If @buffer@ is non-sparse then it /must/ be bound completely and -- contiguously to a single -- 'Graphics.Vulkan.Core10.Handles.DeviceMemory' object -- -- - @buffer@ /must/ have been created with the -- 'Graphics.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 -- 'Graphics.Vulkan.Core10.Handles.DeviceMemory' object -- -- - @countBuffer@ /must/ have been created with the -- 'Graphics.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 -- 'Graphics.Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxDrawIndirectCount@ -- -- - @stride@ /must/ be a multiple of @4@ and /must/ be greater than or -- equal to -- sizeof('Graphics.Vulkan.Core10.OtherTypes.DrawIndirectCommand') -- -- - If @maxDrawCount@ is greater than or equal to @1@, (@stride@ × -- (@maxDrawCount@ - 1) + @offset@ + -- sizeof('Graphics.Vulkan.Core10.OtherTypes.DrawIndirectCommand')) -- /must/ be less than or equal to the size of @buffer@ -- -- - If the count stored in @countBuffer@ is equal to @1@, (@offset@ + -- sizeof('Graphics.Vulkan.Core10.OtherTypes.DrawIndirectCommand')) -- /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('Graphics.Vulkan.Core10.OtherTypes.DrawIndirectCommand')) -- /must/ be less than or equal to the size of @buffer@ -- -- - If -- -- is not enabled this function /must/ not be used -- -- == Valid Usage (Implicit) -- -- - @commandBuffer@ /must/ be a valid -- 'Graphics.Vulkan.Core10.Handles.CommandBuffer' handle -- -- - @buffer@ /must/ be a valid 'Graphics.Vulkan.Core10.Handles.Buffer' -- handle -- -- - @countBuffer@ /must/ be a valid -- 'Graphics.Vulkan.Core10.Handles.Buffer' handle -- -- - @commandBuffer@ /must/ be in the -- -- -- - The 'Graphics.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 -- 'Graphics.Vulkan.Core10.Handles.Device' -- -- == Host Synchronization -- -- - Host access to @commandBuffer@ /must/ be externally synchronized -- -- - Host access to the 'Graphics.Vulkan.Core10.Handles.CommandPool' that -- @commandBuffer@ was allocated from /must/ be externally synchronized -- -- == Command Properties -- -- \' -- -- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ -- | | | | | -- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+=====================================================================================================================================+ -- | Primary | Inside | Graphics | Graphics | -- | Secondary | | | | -- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ -- -- = See Also -- -- 'Graphics.Vulkan.Core10.Handles.Buffer', -- 'Graphics.Vulkan.Core10.Handles.CommandBuffer', -- 'Graphics.Vulkan.Core10.BaseType.DeviceSize' cmdDrawIndirectCount :: forall io . MonadIO io => CommandBuffer -> Buffer -> ("offset" ::: DeviceSize) -> ("countBuffer" ::: Buffer) -> ("countBufferOffset" ::: DeviceSize) -> ("maxDrawCount" ::: Word32) -> ("stride" ::: Word32) -> io () cmdDrawIndirectCount commandBuffer buffer offset countBuffer countBufferOffset maxDrawCount stride = liftIO $ do let vkCmdDrawIndirectCount' = mkVkCmdDrawIndirectCount (pVkCmdDrawIndirectCount (deviceCmds (commandBuffer :: CommandBuffer))) vkCmdDrawIndirectCount' (commandBufferHandle (commandBuffer)) (buffer) (offset) (countBuffer) (countBufferOffset) (maxDrawCount) (stride) pure $ () foreign import ccall #if !defined(SAFE_FOREIGN_CALLS) unsafe #endif "dynamic" mkVkCmdDrawIndexedIndirectCount :: FunPtr (Ptr CommandBuffer_T -> Buffer -> DeviceSize -> Buffer -> DeviceSize -> Word32 -> Word32 -> IO ()) -> Ptr CommandBuffer_T -> Buffer -> DeviceSize -> Buffer -> DeviceSize -> Word32 -> Word32 -> IO () -- | vkCmdDrawIndexedIndirectCount - Perform an indexed indirect 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 -- -- 'cmdDrawIndexedIndirectCount' behaves similarly to -- 'Graphics.Vulkan.Core10.CommandBufferBuilding.cmdDrawIndexedIndirect' -- 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 'Graphics.Vulkan.Core10.Handles.ImageView' is sampled with -- 'Graphics.Vulkan.Core10.Enums.Filter.FILTER_LINEAR' as a result of -- this command, then the image view’s -- -- /must/ contain -- 'Graphics.Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT' -- -- - If a 'Graphics.Vulkan.Core10.Handles.ImageView' is accessed using -- atomic operations as a result of this command, then the image view’s -- -- /must/ contain -- 'Graphics.Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT' -- -- - If a 'Graphics.Vulkan.Core10.Handles.ImageView' is sampled with -- 'Graphics.Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' as -- a result of this command, then the image view’s -- -- /must/ contain -- 'Graphics.Vulkan.Extensions.VK_EXT_filter_cubic.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT' -- -- - Any 'Graphics.Vulkan.Core10.Handles.ImageView' being sampled with -- 'Graphics.Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' as -- a result of this command /must/ have a -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.ImageViewType' and -- format that supports cubic filtering, as specified by -- 'Graphics.Vulkan.Extensions.VK_EXT_filter_cubic.FilterCubicImageViewImageFormatPropertiesEXT'::@filterCubic@ -- returned by -- 'Graphics.Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2' -- -- - Any 'Graphics.Vulkan.Core10.Handles.ImageView' being sampled with -- 'Graphics.Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT' -- with a reduction mode of either -- 'Graphics.Vulkan.Core12.Enums.SamplerReductionMode.SAMPLER_REDUCTION_MODE_MIN' -- or -- 'Graphics.Vulkan.Core12.Enums.SamplerReductionMode.SAMPLER_REDUCTION_MODE_MAX' -- as a result of this command /must/ have a -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.ImageViewType' and -- format that supports cubic filtering together with minmax filtering, -- as specified by -- 'Graphics.Vulkan.Extensions.VK_EXT_filter_cubic.FilterCubicImageViewImageFormatPropertiesEXT'::@filterCubicMinmax@ -- returned by -- 'Graphics.Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2' -- -- - Any 'Graphics.Vulkan.Core10.Handles.Image' created with a -- 'Graphics.Vulkan.Core10.Image.ImageCreateInfo'::@flags@ containing -- 'Graphics.Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CORNER_SAMPLED_BIT_NV' -- sampled as a result of this command /must/ only be sampled using a -- 'Graphics.Vulkan.Core10.Enums.SamplerAddressMode.SamplerAddressMode' -- of -- 'Graphics.Vulkan.Core10.Enums.SamplerAddressMode.SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE'. -- -- - For each set /n/ that is statically used by the -- 'Graphics.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 -- 'Graphics.Vulkan.Core10.Handles.PipelineLayout' that is compatible -- for set /n/, with the -- 'Graphics.Vulkan.Core10.Handles.PipelineLayout' used to create the -- current 'Graphics.Vulkan.Core10.Handles.Pipeline', as described in -- -- -- - For each push constant that is statically used by the -- 'Graphics.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 -- 'Graphics.Vulkan.Core10.Handles.PipelineLayout' that is compatible -- for push constants, with the -- 'Graphics.Vulkan.Core10.Handles.PipelineLayout' used to create the -- current 'Graphics.Vulkan.Core10.Handles.Pipeline', as described in -- -- -- - Descriptors in each bound descriptor set, specified via -- 'Graphics.Vulkan.Core10.CommandBufferBuilding.cmdBindDescriptorSets', -- /must/ be valid if they are statically used by the -- 'Graphics.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 'Graphics.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 -- 'Graphics.Vulkan.Core10.Handles.Pipeline' object bound to the -- pipeline bind point used by this command, since that pipeline was -- bound -- -- - If the 'Graphics.Vulkan.Core10.Handles.Pipeline' object bound to the -- pipeline bind point used by this command accesses a -- 'Graphics.Vulkan.Core10.Handles.Sampler' object that uses -- unnormalized coordinates, that sampler /must/ not be used to sample -- from any 'Graphics.Vulkan.Core10.Handles.Image' with a -- 'Graphics.Vulkan.Core10.Handles.ImageView' of the type -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_3D', -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_CUBE', -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_1D_ARRAY', -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_2D_ARRAY' -- or -- 'Graphics.Vulkan.Core10.Enums.ImageViewType.IMAGE_VIEW_TYPE_CUBE_ARRAY', -- in any shader stage -- -- - If the 'Graphics.Vulkan.Core10.Handles.Pipeline' object bound to the -- pipeline bind point used by this command accesses a -- 'Graphics.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 'Graphics.Vulkan.Core10.Handles.Pipeline' object bound to the -- pipeline bind point used by this command accesses a -- 'Graphics.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 -- -- feature is not enabled, and if the -- 'Graphics.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 -- -- feature is not enabled, and if the -- 'Graphics.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 'Graphics.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 -- -- with the @renderPass@ member of the -- 'Graphics.Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo' -- structure specified when creating the -- 'Graphics.Vulkan.Core10.Handles.Pipeline' bound to -- 'Graphics.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 -- 'Graphics.Vulkan.Core10.Pipeline.GraphicsPipelineCreateInfo' -- structure specified when creating the -- 'Graphics.Vulkan.Core10.Handles.Pipeline' bound to -- 'Graphics.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 -- 'Graphics.Vulkan.Core11.Promoted_From_VK_KHR_multiview.PhysicalDeviceMultiviewProperties'::@maxMultiviewInstanceIndex@. -- -- - If the bound graphics pipeline was created with -- 'Graphics.Vulkan.Extensions.VK_EXT_sample_locations.PipelineSampleLocationsStateCreateInfoEXT'::@sampleLocationsEnable@ -- set to 'Graphics.Vulkan.Core10.BaseType.TRUE' and the current -- subpass has a depth\/stencil attachment, then that attachment /must/ -- have been created with the -- 'Graphics.Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT' -- bit set -- -- - All vertex input bindings accessed via vertex input variables -- declared in the vertex shader entry point’s interface /must/ have -- valid buffers bound -- -- - For a given vertex buffer binding, any attribute data fetched /must/ -- be entirely contained within the corresponding vertex buffer -- binding, as described in -- -- -- - If @buffer@ is non-sparse then it /must/ be bound completely and -- contiguously to a single -- 'Graphics.Vulkan.Core10.Handles.DeviceMemory' object -- -- - @buffer@ /must/ have been created with the -- 'Graphics.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 -- 'Graphics.Vulkan.Core10.Handles.DeviceMemory' object -- -- - @countBuffer@ /must/ have been created with the -- 'Graphics.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 -- 'Graphics.Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxDrawIndirectCount@ -- -- - @stride@ /must/ be a multiple of @4@ and /must/ be greater than or -- equal to -- sizeof('Graphics.Vulkan.Core10.OtherTypes.DrawIndexedIndirectCommand') -- -- - If @maxDrawCount@ is greater than or equal to @1@, (@stride@ × -- (@maxDrawCount@ - 1) + @offset@ + -- sizeof('Graphics.Vulkan.Core10.OtherTypes.DrawIndexedIndirectCommand')) -- /must/ be less than or equal to the size of @buffer@ -- -- - If count stored in @countBuffer@ is equal to @1@, (@offset@ + -- sizeof('Graphics.Vulkan.Core10.OtherTypes.DrawIndexedIndirectCommand')) -- /must/ be less than or equal to the size of @buffer@ -- -- - If count stored in @countBuffer@ is greater than @1@, (@stride@ × -- (@drawCount@ - 1) + @offset@ + -- sizeof('Graphics.Vulkan.Core10.OtherTypes.DrawIndexedIndirectCommand')) -- /must/ be less than or equal to the size of @buffer@ -- -- == Valid Usage (Implicit) -- -- - @commandBuffer@ /must/ be a valid -- 'Graphics.Vulkan.Core10.Handles.CommandBuffer' handle -- -- - @buffer@ /must/ be a valid 'Graphics.Vulkan.Core10.Handles.Buffer' -- handle -- -- - @countBuffer@ /must/ be a valid -- 'Graphics.Vulkan.Core10.Handles.Buffer' handle -- -- - @commandBuffer@ /must/ be in the -- -- -- - The 'Graphics.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 -- 'Graphics.Vulkan.Core10.Handles.Device' -- -- == Host Synchronization -- -- - Host access to @commandBuffer@ /must/ be externally synchronized -- -- - Host access to the 'Graphics.Vulkan.Core10.Handles.CommandPool' that -- @commandBuffer@ was allocated from /must/ be externally synchronized -- -- == Command Properties -- -- \' -- -- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ -- | | | | | -- +============================================================================================================================+========================================================================================================================+=======================================================================================================================+=====================================================================================================================================+ -- | Primary | Inside | Graphics | Graphics | -- | Secondary | | | | -- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ -- -- = See Also -- -- 'Graphics.Vulkan.Core10.Handles.Buffer', -- 'Graphics.Vulkan.Core10.Handles.CommandBuffer', -- 'Graphics.Vulkan.Core10.BaseType.DeviceSize' cmdDrawIndexedIndirectCount :: forall io . MonadIO io => CommandBuffer -> Buffer -> ("offset" ::: DeviceSize) -> ("countBuffer" ::: Buffer) -> ("countBufferOffset" ::: DeviceSize) -> ("maxDrawCount" ::: Word32) -> ("stride" ::: Word32) -> io () cmdDrawIndexedIndirectCount commandBuffer buffer offset countBuffer countBufferOffset maxDrawCount stride = liftIO $ do let vkCmdDrawIndexedIndirectCount' = mkVkCmdDrawIndexedIndirectCount (pVkCmdDrawIndexedIndirectCount (deviceCmds (commandBuffer :: CommandBuffer))) vkCmdDrawIndexedIndirectCount' (commandBufferHandle (commandBuffer)) (buffer) (offset) (countBuffer) (countBufferOffset) (maxDrawCount) (stride) pure $ ()