vulkan-2.0.0.0: src/Graphics/Vulkan/Extensions/VK_AMD_draw_indirect_count.hs
{-# language Strict #-}
{-# language CPP #-}
{-# language PatternSynonyms #-}
{-# language OverloadedStrings #-}
{-# language DataKinds #-}
{-# language TypeOperators #-}
module Graphics.Vulkan.Extensions.VK_AMD_draw_indirect_count
( pattern VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION
, pattern VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME
, vkCmdDrawIndirectCountAMD
, vkCmdDrawIndexedIndirectCountAMD
) where
import Data.String
( IsString
)
import Data.Word
( Word32
)
import Graphics.Vulkan.NamedType
( (:::)
)
import Graphics.Vulkan.Core10.DeviceInitialization
( VkDeviceSize
)
import Graphics.Vulkan.Core10.MemoryManagement
( VkBuffer
)
import Graphics.Vulkan.Core10.Queue
( VkCommandBuffer
)
-- No documentation found for TopLevel "VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION"
pattern VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION :: Integral a => a
pattern VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION = 1
-- No documentation found for TopLevel "VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME"
pattern VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME :: (Eq a ,IsString a) => a
pattern VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME = "VK_AMD_draw_indirect_count"
-- | vkCmdDrawIndirectCountAMD - Perform an indirect draw with the draw count
-- sourced from a buffer
--
-- = Parameters
-- #_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
-- #_description#
--
-- @vkCmdDrawIndirectCountAMD@ behaves similarly to
-- 'Graphics.Vulkan.Core10.CommandBufferBuilding.vkCmdDrawIndirect' 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 @buffer@ is non-sparse then it /must/ be bound completely and
-- contiguously to a single @VkDeviceMemory@ object
--
-- - @buffer@ /must/ have been created with the
-- @VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT@ bit set
--
-- - If @countBuffer@ is non-sparse then it /must/ be bound completely
-- and contiguously to a single @VkDeviceMemory@ object
--
-- - @countBuffer@ /must/ have been created with the
-- @VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT@ bit set
--
-- - @offset@ /must/ be a multiple of @4@
--
-- - @countBufferOffset@ /must/ be a multiple of @4@
--
-- - @stride@ /must/ be a multiple of @4@ and /must/ be greater than or
-- equal to @sizeof@(@VkDrawIndirectCommand@)
--
-- - If @maxDrawCount@ is greater than or equal to @1@, (@stride@ ×
-- (@maxDrawCount@ - 1) + @offset@ + @sizeof@(@VkDrawIndirectCommand@))
-- /must/ be less than or equal to the size of @buffer@
--
-- - If the
-- <{html_spec_relative}#features-features-drawIndirectFirstInstance drawIndirectFirstInstance>
-- feature is not enabled, all the @firstInstance@ members of the
-- @VkDrawIndirectCommand@ structures accessed by this command /must/
-- be @0@
--
-- - The current render pass /must/ be
-- <{html_spec_relative}#renderpass-compatibility compatible> with the
-- @renderPass@ member of the @VkGraphicsPipelineCreateInfo@ structure
-- specified when creating the @VkPipeline@ bound to
-- @VK_PIPELINE_BIND_POINT_GRAPHICS@.
--
-- - The subpass index of the current render pass /must/ be equal to the
-- @subpass@ member of the @VkGraphicsPipelineCreateInfo@ structure
-- specified when creating the @VkPipeline@ bound to
-- @VK_PIPELINE_BIND_POINT_GRAPHICS@.
--
-- - For each set /n/ that is statically used by the @VkPipeline@ bound
-- to @VK_PIPELINE_BIND_POINT_GRAPHICS@, a descriptor set /must/ have
-- been bound to /n/ at @VK_PIPELINE_BIND_POINT_GRAPHICS@, with a
-- @VkPipelineLayout@ that is compatible for set /n/, with the
-- @VkPipelineLayout@ used to create the current @VkPipeline@, as
-- described in
-- <{html_spec_relative}#descriptorsets-compatibility {html_spec_relative}#descriptorsets-compatibility>
--
-- - For each push constant that is statically used by the @VkPipeline@
-- bound to @VK_PIPELINE_BIND_POINT_GRAPHICS@, a push constant value
-- /must/ have been set for @VK_PIPELINE_BIND_POINT_GRAPHICS@, with a
-- @VkPipelineLayout@ that is compatible for push constants, with the
-- @VkPipelineLayout@ used to create the current @VkPipeline@, as
-- described in
-- <{html_spec_relative}#descriptorsets-compatibility {html_spec_relative}#descriptorsets-compatibility>
--
-- - Descriptors in each bound descriptor set, specified via
-- @vkCmdBindDescriptorSets@, /must/ be valid if they are statically
-- used by the bound @VkPipeline@ object, specified via
-- @vkCmdBindPipeline@
--
-- - All vertex input bindings accessed via vertex input variables
-- declared in the vertex shader entry point’s interface /must/ have
-- valid buffers bound
--
-- - A valid graphics pipeline /must/ be bound to the current command
-- buffer with @VK_PIPELINE_BIND_POINT_GRAPHICS@
--
-- - If the @VkPipeline@ object bound to
-- @VK_PIPELINE_BIND_POINT_GRAPHICS@ requires any dynamic state, that
-- state /must/ have been set on the current command buffer
--
-- - If the count stored in @countBuffer@ is equal to @1@, (@offset@ +
-- @sizeof@(@VkDrawIndirectCommand@)) /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@(@VkDrawIndirectCommand@))
-- /must/ be less than or equal to the size of @buffer@
--
-- - The count stored in @countBuffer@ /must/ be less than or equal to
-- @VkPhysicalDeviceLimits@::@maxDrawIndirectCount@
--
-- - Every input attachment used by the current subpass /must/ be bound
-- to the pipeline via a descriptor set
--
-- - If any @VkSampler@ object that is accessed from a shader by the
-- @VkPipeline@ bound to @VK_PIPELINE_BIND_POINT_GRAPHICS@ uses
-- unnormalized coordinates, it /must/ not be used to sample from any
-- @VkImage@ with a @VkImageView@ of the type @VK_IMAGE_VIEW_TYPE_3D@,
-- @VK_IMAGE_VIEW_TYPE_CUBE@, @VK_IMAGE_VIEW_TYPE_1D_ARRAY@,
-- @VK_IMAGE_VIEW_TYPE_2D_ARRAY@ or @VK_IMAGE_VIEW_TYPE_CUBE_ARRAY@, in
-- any shader stage
--
-- - If any @VkSampler@ object that is accessed from a shader by the
-- @VkPipeline@ bound to @VK_PIPELINE_BIND_POINT_GRAPHICS@ uses
-- unnormalized coordinates, it /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 any @VkSampler@ object that is accessed from a shader by the
-- @VkPipeline@ bound to @VK_PIPELINE_BIND_POINT_GRAPHICS@ uses
-- unnormalized coordinates, it /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
-- <{html_spec_relative}#features-features-robustBufferAccess robust buffer access>
-- feature is not enabled, and any shader stage in the @VkPipeline@
-- object bound to @VK_PIPELINE_BIND_POINT_GRAPHICS@ accesses a uniform
-- buffer, it /must/ not access values outside of the range of that
-- buffer specified in the bound descriptor set
--
-- - If the
-- <{html_spec_relative}#features-features-robustBufferAccess robust buffer access>
-- feature is not enabled, and any shader stage in the @VkPipeline@
-- object bound to @VK_PIPELINE_BIND_POINT_GRAPHICS@ accesses a storage
-- buffer, it /must/ not access values outside of the range of that
-- buffer specified in the bound descriptor set
--
-- - Any @VkImageView@ being sampled with @VK_FILTER_LINEAR@ as a result
-- of this command /must/ be of a format which supports linear
-- filtering, as specified by the
-- @VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT@ flag in
-- @VkFormatProperties@::@linearTilingFeatures@ (for a linear image) or
-- @VkFormatProperties@::@optimalTilingFeatures@(for an optimally tiled
-- image) returned by @vkGetPhysicalDeviceFormatProperties@
--
-- - 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.
--
-- == Valid Usage (Implicit)
--
-- - @commandBuffer@ /must/ be a valid @VkCommandBuffer@ handle
--
-- - @buffer@ /must/ be a valid @VkBuffer@ handle
--
-- - @countBuffer@ /must/ be a valid @VkBuffer@ handle
--
-- - @commandBuffer@ /must/ be in the
-- <#commandbuffers-lifecycle recording state>
--
-- - The @VkCommandPool@ 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 @VkDevice@
--
-- == Host Synchronization
--
-- - Host access to @commandBuffer@ /must/ be externally synchronized
--
-- - Host access to the @VkCommandPool@ that @commandBuffer@ was
-- allocated from /must/ be externally synchronized
--
-- == Command Properties
--
-- > +-----------------+-----------------+-----------------+-----------------+
-- > | <#VkCommandBuff | <#vkCmdBeginRen | <#VkQueueFlagBi | <#synchronizati |
-- > | erLevel Command | derPass Render | ts Supported Qu | on-pipeline-sta |
-- > | Buffer Levels> | Pass Scope> | eue Types> | ges-types Pipel |
-- > | | | | ine Type> |
-- > +=================+=================+=================+=================+
-- > | Primary | Inside | Graphics | Graphics |
-- > | Secondary | | | |
-- > +-----------------+-----------------+-----------------+-----------------+
--
-- = See Also
-- #_see_also#
--
-- 'Graphics.Vulkan.Core10.MemoryManagement.VkBuffer',
-- 'Graphics.Vulkan.Core10.Queue.VkCommandBuffer', @VkDeviceSize@
foreign import ccall "vkCmdDrawIndirectCountAMD" vkCmdDrawIndirectCountAMD :: ("commandBuffer" ::: VkCommandBuffer) -> ("buffer" ::: VkBuffer) -> ("offset" ::: VkDeviceSize) -> ("countBuffer" ::: VkBuffer) -> ("countBufferOffset" ::: VkDeviceSize) -> ("maxDrawCount" ::: Word32) -> ("stride" ::: Word32) -> IO ()
-- | vkCmdDrawIndexedIndirectCountAMD - Perform an indexed indirect draw with
-- the draw count sourced from a buffer
--
-- = Parameters
-- #_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
-- #_description#
--
-- @vkCmdDrawIndexedIndirectCountAMD@ behaves similarly to
-- 'Graphics.Vulkan.Core10.CommandBufferBuilding.vkCmdDrawIndexedIndirect'
-- 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 @buffer@ is non-sparse then it /must/ be bound completely and
-- contiguously to a single @VkDeviceMemory@ object
--
-- - @buffer@ /must/ have been created with the
-- @VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT@ bit set
--
-- - If @countBuffer@ is non-sparse then it /must/ be bound completely
-- and contiguously to a single @VkDeviceMemory@ object
--
-- - @countBuffer@ /must/ have been created with the
-- @VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT@ bit set
--
-- - @offset@ /must/ be a multiple of @4@
--
-- - @countBufferOffset@ /must/ be a multiple of @4@
--
-- - @stride@ /must/ be a multiple of @4@ and /must/ be greater than or
-- equal to @sizeof@(@VkDrawIndirectCommand@)
--
-- - If @maxDrawCount@ is greater than or equal to @1@, (@stride@ ×
-- (@maxDrawCount@ - 1) + @offset@ + @sizeof@(@VkDrawIndirectCommand@))
-- /must/ be less than or equal to the size of @buffer@
--
-- - If the
-- <{html_spec_relative}#features-features-drawIndirectFirstInstance drawIndirectFirstInstance>
-- feature is not enabled, all the @firstInstance@ members of the
-- @VkDrawIndexedIndirectCommand@ structures accessed by this command
-- /must/ be @0@
--
-- - The current render pass /must/ be
-- <{html_spec_relative}#renderpass-compatibility compatible> with the
-- @renderPass@ member of the @VkGraphicsPipelineCreateInfo@ structure
-- specified when creating the @VkPipeline@ bound to
-- @VK_PIPELINE_BIND_POINT_GRAPHICS@.
--
-- - The subpass index of the current render pass /must/ be equal to the
-- @subpass@ member of the @VkGraphicsPipelineCreateInfo@ structure
-- specified when creating the @VkPipeline@ bound to
-- @VK_PIPELINE_BIND_POINT_GRAPHICS@.
--
-- - For each set /n/ that is statically used by the @VkPipeline@ bound
-- to @VK_PIPELINE_BIND_POINT_GRAPHICS@, a descriptor set /must/ have
-- been bound to /n/ at @VK_PIPELINE_BIND_POINT_GRAPHICS@, with a
-- @VkPipelineLayout@ that is compatible for set /n/, with the
-- @VkPipelineLayout@ used to create the current @VkPipeline@, as
-- described in
-- <{html_spec_relative}#descriptorsets-compatibility {html_spec_relative}#descriptorsets-compatibility>
--
-- - For each push constant that is statically used by the @VkPipeline@
-- bound to @VK_PIPELINE_BIND_POINT_GRAPHICS@, a push constant value
-- /must/ have been set for @VK_PIPELINE_BIND_POINT_GRAPHICS@, with a
-- @VkPipelineLayout@ that is compatible for push constants, with the
-- @VkPipelineLayout@ used to create the current @VkPipeline@, as
-- described in
-- <{html_spec_relative}#descriptorsets-compatibility {html_spec_relative}#descriptorsets-compatibility>
--
-- - Descriptors in each bound descriptor set, specified via
-- @vkCmdBindDescriptorSets@, /must/ be valid if they are statically
-- used by the bound @VkPipeline@ object, specified via
-- @vkCmdBindPipeline@
--
-- - All vertex input bindings accessed via vertex input variables
-- declared in the vertex shader entry point’s interface /must/ have
-- valid buffers bound
--
-- - A valid graphics pipeline /must/ be bound to the current command
-- buffer with @VK_PIPELINE_BIND_POINT_GRAPHICS@
--
-- - If the @VkPipeline@ object bound to
-- @VK_PIPELINE_BIND_POINT_GRAPHICS@ requires any dynamic state, that
-- state /must/ have been set on the current command buffer
--
-- - If count stored in @countBuffer@ is equal to @1@, (@offset@ +
-- @sizeof@(@VkDrawIndexedIndirectCommand@)) /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@(@VkDrawIndexedIndirectCommand@)) /must/ be less than or
-- equal to the size of @buffer@
--
-- - @drawCount@ /must/ be less than or equal to
-- @VkPhysicalDeviceLimits@::@maxDrawIndirectCount@
--
-- - Every input attachment used by the current subpass /must/ be bound
-- to the pipeline via a descriptor set
--
-- - If any @VkSampler@ object that is accessed from a shader by the
-- @VkPipeline@ bound to @VK_PIPELINE_BIND_POINT_GRAPHICS@ uses
-- unnormalized coordinates, it /must/ not be used to sample from any
-- @VkImage@ with a @VkImageView@ of the type @VK_IMAGE_VIEW_TYPE_3D@,
-- @VK_IMAGE_VIEW_TYPE_CUBE@, @VK_IMAGE_VIEW_TYPE_1D_ARRAY@,
-- @VK_IMAGE_VIEW_TYPE_2D_ARRAY@ or @VK_IMAGE_VIEW_TYPE_CUBE_ARRAY@, in
-- any shader stage
--
-- - If any @VkSampler@ object that is accessed from a shader by the
-- @VkPipeline@ bound to @VK_PIPELINE_BIND_POINT_GRAPHICS@ uses
-- unnormalized coordinates, it /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 any @VkSampler@ object that is accessed from a shader by the
-- @VkPipeline@ bound to @VK_PIPELINE_BIND_POINT_GRAPHICS@ uses
-- unnormalized coordinates, it /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
-- <{html_spec_relative}#features-features-robustBufferAccess robust buffer access>
-- feature is not enabled, and any shader stage in the @VkPipeline@
-- object bound to @VK_PIPELINE_BIND_POINT_GRAPHICS@ accesses a uniform
-- buffer, it /must/ not access values outside of the range of that
-- buffer specified in the bound descriptor set
--
-- - If the
-- <{html_spec_relative}#features-features-robustBufferAccess robust buffer access>
-- feature is not enabled, and any shader stage in the @VkPipeline@
-- object bound to @VK_PIPELINE_BIND_POINT_GRAPHICS@ accesses a storage
-- buffer, it /must/ not access values outside of the range of that
-- buffer specified in the bound descriptor set
--
-- - Any @VkImageView@ being sampled with @VK_FILTER_LINEAR@ as a result
-- of this command /must/ be of a format which supports linear
-- filtering, as specified by the
-- @VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT@ flag in
-- @VkFormatProperties@::@linearTilingFeatures@ (for a linear image) or
-- @VkFormatProperties@::@optimalTilingFeatures@(for an optimally tiled
-- image) returned by @vkGetPhysicalDeviceFormatProperties@
--
-- - 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.
--
-- == Valid Usage (Implicit)
--
-- - @commandBuffer@ /must/ be a valid @VkCommandBuffer@ handle
--
-- - @buffer@ /must/ be a valid @VkBuffer@ handle
--
-- - @countBuffer@ /must/ be a valid @VkBuffer@ handle
--
-- - @commandBuffer@ /must/ be in the
-- <#commandbuffers-lifecycle recording state>
--
-- - The @VkCommandPool@ 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 @VkDevice@
--
-- == Host Synchronization
--
-- - Host access to @commandBuffer@ /must/ be externally synchronized
--
-- - Host access to the @VkCommandPool@ that @commandBuffer@ was
-- allocated from /must/ be externally synchronized
--
-- == Command Properties
--
-- > +-----------------+-----------------+-----------------+-----------------+
-- > | <#VkCommandBuff | <#vkCmdBeginRen | <#VkQueueFlagBi | <#synchronizati |
-- > | erLevel Command | derPass Render | ts Supported Qu | on-pipeline-sta |
-- > | Buffer Levels> | Pass Scope> | eue Types> | ges-types Pipel |
-- > | | | | ine Type> |
-- > +=================+=================+=================+=================+
-- > | Primary | Inside | Graphics | Graphics |
-- > | Secondary | | | |
-- > +-----------------+-----------------+-----------------+-----------------+
--
-- = See Also
-- #_see_also#
--
-- 'Graphics.Vulkan.Core10.MemoryManagement.VkBuffer',
-- 'Graphics.Vulkan.Core10.Queue.VkCommandBuffer', @VkDeviceSize@
foreign import ccall "vkCmdDrawIndexedIndirectCountAMD" vkCmdDrawIndexedIndirectCountAMD :: ("commandBuffer" ::: VkCommandBuffer) -> ("buffer" ::: VkBuffer) -> ("offset" ::: VkDeviceSize) -> ("countBuffer" ::: VkBuffer) -> ("countBufferOffset" ::: VkDeviceSize) -> ("maxDrawCount" ::: Word32) -> ("stride" ::: Word32) -> IO ()