Class KHRDrawIndirectCount
- java.lang.Object
-
- org.lwjgl.vulkan.KHRDrawIndirectCount
-
public class KHRDrawIndirectCount extends java.lang.Object
This extension is based off the VK_AMD_draw_indirect_count extension. This extension allows an application to source the number of draw calls for indirect draw calls from a buffer. This enables applications to generate arbitrary amounts of draw commands and execute them without host intervention.- Name String
VK_KHR_draw_indirect_count
- Extension Type
- Device extension
- Registered Extension Number
- 170
- Revision
- 1
- Extension and Version Dependencies
- Requires Vulkan 1.0
- Contact
- Piers Daniell pdaniell-nv
- Status
- Draft
- Last Modified Date
- 2017-08-25
- IP Status
- No known IP claims.
- Contributors
- Matthaeus G. Chajdas, AMD
- Derrick Owens, AMD
- Graham Sellers, AMD
- Daniel Rakos, AMD
- Dominik Witczak, AMD
- Piers Daniell, NVIDIA
-
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME
The extension name.static int
VK_KHR_DRAW_INDIRECT_COUNT_SPEC_VERSION
The extension specification version.
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static void
vkCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, long buffer, long offset, long countBuffer, long countBufferOffset, int maxDrawCount, int stride)
Perform an indexed indirect draw with the draw count sourced from a buffer.static void
vkCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, long buffer, long offset, long countBuffer, long countBufferOffset, int maxDrawCount, int stride)
Perform an indirect draw with the draw count sourced from a buffer.
-
-
-
Field Detail
-
VK_KHR_DRAW_INDIRECT_COUNT_SPEC_VERSION
public static final int VK_KHR_DRAW_INDIRECT_COUNT_SPEC_VERSION
The extension specification version.- See Also:
- Constant Field Values
-
VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME
public static final java.lang.String VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME
The extension name.- See Also:
- Constant Field Values
-
-
Method Detail
-
vkCmdDrawIndirectCountKHR
public static void vkCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, long buffer, long offset, long countBuffer, long countBufferOffset, int maxDrawCount, int stride)
Perform an indirect draw with the draw count sourced from a buffer.C Specification
To record a non-indexed draw call with a draw call count sourced from a buffer, call:
void vkCmdDrawIndirectCountKHR( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);
or the equivalent command
void vkCmdDrawIndirectCountAMD( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);
Description
vkCmdDrawIndirectCountKHR
behaves similarly toCmdDrawIndirect
except that the draw count is read by the device from a buffer during execution. The command will read an unsigned 32-bit integer fromcountBuffer
located atcountBufferOffset
and use this as the draw count.Valid Usage
- If a
VkImageView
is sampled withFILTER_LINEAR
as a result of this command, then the image view’s format features must containFORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
- If a
VkImageView
is accessed using atomic operations as a result of this command, then the image view’s format features must containFORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT
- If a
VkImageView
is sampled withFILTER_CUBIC_EXT
as a result of this command, then the image view’s format features must containFORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT
- Any
VkImageView
being sampled withFILTER_CUBIC_EXT
as a result of this command must have aVkImageViewType
and format that supports cubic filtering, as specified byVkFilterCubicImageViewImageFormatPropertiesEXT
::filterCubic
returned byvkGetPhysicalDeviceImageFormatProperties2
- Any
VkImageView
being sampled withFILTER_CUBIC_EXT
with a reduction mode of eitherSAMPLER_REDUCTION_MODE_MIN_EXT
orSAMPLER_REDUCTION_MODE_MAX_EXT
as a result of this command must have aVkImageViewType
and format that supports cubic filtering together with minmax filtering, as specified byVkFilterCubicImageViewImageFormatPropertiesEXT
::filterCubicMinmax
returned byvkGetPhysicalDeviceImageFormatProperties2
- Any
VkImage
created with aVkImageCreateInfo
::flags
containingIMAGE_CREATE_CORNER_SAMPLED_BIT_NV
sampled as a result of this command must only be sampled using aVkSamplerAddressMode
ofSAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE
. - For each set n that is statically used by the
VkPipeline
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 aVkPipelineLayout
that is compatible for set n, with theVkPipelineLayout
used to create the currentVkPipeline
, as described in Pipeline Layout Compatibility - For each push constant that is statically used by the
VkPipeline
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 aVkPipelineLayout
that is compatible for push constants, with theVkPipelineLayout
used to create the currentVkPipeline
, as described in Pipeline Layout Compatibility - Descriptors in each bound descriptor set, specified via
vkCmdBindDescriptorSets
, must be valid if they are statically used by theVkPipeline
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
VkPipeline
object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set forcommandBuffer
- If the
VkPipeline
object bound to the pipeline bind point used by this command accesses aVkSampler
object that uses unnormalized coordinates, that sampler must not be used to sample from anyVkImage
with aVkImageView
of the typeIMAGE_VIEW_TYPE_3D
,IMAGE_VIEW_TYPE_CUBE
,IMAGE_VIEW_TYPE_1D_ARRAY
,IMAGE_VIEW_TYPE_2D_ARRAY
orIMAGE_VIEW_TYPE_CUBE_ARRAY
, in any shader stage - If the
VkPipeline
object bound to the pipeline bind point used by this command accesses aVkSampler
object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-VOpImageSample*
orOpImageSparseSample*
instructions withImplicitLod
,Dref
orProj
in their name, in any shader stage - If the
VkPipeline
object bound to the pipeline bind point used by this command accesses aVkSampler
object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-VOpImageSample*
orOpImageSparseSample*
instructions that includes a LOD bias or any offset values, in any shader stage - If the robust buffer access feature is not enabled, and if the
VkPipeline
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 robust buffer access feature is not enabled, and if the
VkPipeline
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 theVkPipeline
object bound to the pipeline bind point used by this command must not be a protected resource - The current render pass must be compatible with the
renderPass
member of theVkGraphicsPipelineCreateInfo
structure specified when creating theVkPipeline
bound toPIPELINE_BIND_POINT_GRAPHICS
. - The subpass index of the current render pass must be equal to the
subpass
member of theVkGraphicsPipelineCreateInfo
structure specified when creating theVkPipeline
bound toPIPELINE_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
VkPhysicalDeviceMultiviewProperties
::maxMultiviewInstanceIndex
. - If the bound graphics pipeline was created with
VkPipelineSampleLocationsStateCreateInfoEXT
::sampleLocationsEnable
set toTRUE
and the current subpass has a depth/stencil attachment, then that attachment must have been created with theIMAGE_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 Vertex Input Description
- If
buffer
is non-sparse then it must be bound completely and contiguously to a singleVkDeviceMemory
object buffer
must have been created with theBUFFER_USAGE_INDIRECT_BUFFER_BIT
bit setoffset
must be a multiple of 4commandBuffer
must not be a protected command buffer- If
countBuffer
is non-sparse then it must be bound completely and contiguously to a singleVkDeviceMemory
object countBuffer
must have been created with theBUFFER_USAGE_INDIRECT_BUFFER_BIT
bit setcountBufferOffset
must be a multiple of 4- The count stored in
countBuffer
must be less than or equal toVkPhysicalDeviceLimits
::maxDrawIndirectCount
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(
must be less than or equal to the size ofVkDrawIndirectCommand
))buffer
- If the count stored in
countBuffer
is equal to 1,(offset + sizeof(
must be less than or equal to the size ofVkDrawIndirectCommand
))buffer
- If the count stored in
countBuffer
is greater than 1,(stride × (drawCount - 1) + offset + sizeof(
must be less than or equal to the size ofVkDrawIndirectCommand
))buffer
Valid Usage (Implicit)
commandBuffer
must be a validVkCommandBuffer
handlebuffer
must be a validVkBuffer
handlecountBuffer
must be a validVkBuffer
handlecommandBuffer
must be in the recording state- The
VkCommandPool
thatcommandBuffer
was allocated from must support graphics operations - This command must only be called inside of a render pass instance
- Each of
buffer
,commandBuffer
, andcountBuffer
must have been created, allocated, or retrieved from the sameVkDevice
Host Synchronization
- Host access to
commandBuffer
must be externally synchronized - Host access to the
VkCommandPool
thatcommandBuffer
was allocated from must be externally synchronized
Command Properties
Command Buffer Levels Render Pass Scope Supported Queue Types Pipeline Type Primary Secondary Inside Graphics Graphics - Parameters:
commandBuffer
- the command buffer into which the command is recorded.buffer
- the buffer containing draw parameters.offset
- the byte offset intobuffer
where parameters begin.countBuffer
- the buffer containing the draw count.countBufferOffset
- the byte offset intocountBuffer
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 incountBuffer
andmaxDrawCount
.stride
- the byte stride between successive sets of draw parameters.
- If a
-
vkCmdDrawIndexedIndirectCountKHR
public static void vkCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, long buffer, long offset, long countBuffer, long countBufferOffset, int maxDrawCount, int stride)
Perform an indexed indirect draw with the draw count sourced from a buffer.C Specification
To record an indexed draw call with a draw call count sourced from a buffer, call:
void vkCmdDrawIndexedIndirectCountKHR( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);
or the equivalent command
void vkCmdDrawIndexedIndirectCountAMD( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);
Description
vkCmdDrawIndexedIndirectCountKHR
behaves similarly toCmdDrawIndexedIndirect
except that the draw count is read by the device from a buffer during execution. The command will read an unsigned 32-bit integer fromcountBuffer
located atcountBufferOffset
and use this as the draw count.Valid Usage
- If a
VkImageView
is sampled withFILTER_LINEAR
as a result of this command, then the image view’s format features must containFORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
- If a
VkImageView
is accessed using atomic operations as a result of this command, then the image view’s format features must containFORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT
- If a
VkImageView
is sampled withFILTER_CUBIC_EXT
as a result of this command, then the image view’s format features must containFORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT
- Any
VkImageView
being sampled withFILTER_CUBIC_EXT
as a result of this command must have aVkImageViewType
and format that supports cubic filtering, as specified byVkFilterCubicImageViewImageFormatPropertiesEXT
::filterCubic
returned byvkGetPhysicalDeviceImageFormatProperties2
- Any
VkImageView
being sampled withFILTER_CUBIC_EXT
with a reduction mode of eitherSAMPLER_REDUCTION_MODE_MIN_EXT
orSAMPLER_REDUCTION_MODE_MAX_EXT
as a result of this command must have aVkImageViewType
and format that supports cubic filtering together with minmax filtering, as specified byVkFilterCubicImageViewImageFormatPropertiesEXT
::filterCubicMinmax
returned byvkGetPhysicalDeviceImageFormatProperties2
- Any
VkImage
created with aVkImageCreateInfo
::flags
containingIMAGE_CREATE_CORNER_SAMPLED_BIT_NV
sampled as a result of this command must only be sampled using aVkSamplerAddressMode
ofSAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE
. - For each set n that is statically used by the
VkPipeline
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 aVkPipelineLayout
that is compatible for set n, with theVkPipelineLayout
used to create the currentVkPipeline
, as described in Pipeline Layout Compatibility - For each push constant that is statically used by the
VkPipeline
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 aVkPipelineLayout
that is compatible for push constants, with theVkPipelineLayout
used to create the currentVkPipeline
, as described in Pipeline Layout Compatibility - Descriptors in each bound descriptor set, specified via
vkCmdBindDescriptorSets
, must be valid if they are statically used by theVkPipeline
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
VkPipeline
object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set forcommandBuffer
- If the
VkPipeline
object bound to the pipeline bind point used by this command accesses aVkSampler
object that uses unnormalized coordinates, that sampler must not be used to sample from anyVkImage
with aVkImageView
of the typeIMAGE_VIEW_TYPE_3D
,IMAGE_VIEW_TYPE_CUBE
,IMAGE_VIEW_TYPE_1D_ARRAY
,IMAGE_VIEW_TYPE_2D_ARRAY
orIMAGE_VIEW_TYPE_CUBE_ARRAY
, in any shader stage - If the
VkPipeline
object bound to the pipeline bind point used by this command accesses aVkSampler
object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-VOpImageSample*
orOpImageSparseSample*
instructions withImplicitLod
,Dref
orProj
in their name, in any shader stage - If the
VkPipeline
object bound to the pipeline bind point used by this command accesses aVkSampler
object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-VOpImageSample*
orOpImageSparseSample*
instructions that includes a LOD bias or any offset values, in any shader stage - If the robust buffer access feature is not enabled, and if the
VkPipeline
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 robust buffer access feature is not enabled, and if the
VkPipeline
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 theVkPipeline
object bound to the pipeline bind point used by this command must not be a protected resource - The current render pass must be compatible with the
renderPass
member of theVkGraphicsPipelineCreateInfo
structure specified when creating theVkPipeline
bound toPIPELINE_BIND_POINT_GRAPHICS
. - The subpass index of the current render pass must be equal to the
subpass
member of theVkGraphicsPipelineCreateInfo
structure specified when creating theVkPipeline
bound toPIPELINE_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
VkPhysicalDeviceMultiviewProperties
::maxMultiviewInstanceIndex
. - If the bound graphics pipeline was created with
VkPipelineSampleLocationsStateCreateInfoEXT
::sampleLocationsEnable
set toTRUE
and the current subpass has a depth/stencil attachment, then that attachment must have been created with theIMAGE_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 Vertex Input Description
- If
buffer
is non-sparse then it must be bound completely and contiguously to a singleVkDeviceMemory
object buffer
must have been created with theBUFFER_USAGE_INDIRECT_BUFFER_BIT
bit setoffset
must be a multiple of 4commandBuffer
must not be a protected command buffer- If
countBuffer
is non-sparse then it must be bound completely and contiguously to a singleVkDeviceMemory
object countBuffer
must have been created with theBUFFER_USAGE_INDIRECT_BUFFER_BIT
bit setcountBufferOffset
must be a multiple of 4- The count stored in
countBuffer
must be less than or equal toVkPhysicalDeviceLimits
::maxDrawIndirectCount
stride
must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndexedIndirectCommand
)- If
maxDrawCount
is greater than or equal to 1,(stride × (maxDrawCount - 1) + offset + sizeof(
must be less than or equal to the size ofVkDrawIndexedIndirectCommand
))buffer
- If count stored in
countBuffer
is equal to 1,(offset + sizeof(
must be less than or equal to the size ofVkDrawIndexedIndirectCommand
))buffer
- If count stored in
countBuffer
is greater than 1,(stride × (drawCount - 1) + offset + sizeof(
must be less than or equal to the size ofVkDrawIndexedIndirectCommand
))buffer
Valid Usage (Implicit)
commandBuffer
must be a validVkCommandBuffer
handlebuffer
must be a validVkBuffer
handlecountBuffer
must be a validVkBuffer
handlecommandBuffer
must be in the recording state- The
VkCommandPool
thatcommandBuffer
was allocated from must support graphics operations - This command must only be called inside of a render pass instance
- Each of
buffer
,commandBuffer
, andcountBuffer
must have been created, allocated, or retrieved from the sameVkDevice
Host Synchronization
- Host access to
commandBuffer
must be externally synchronized - Host access to the
VkCommandPool
thatcommandBuffer
was allocated from must be externally synchronized
Command Properties
Command Buffer Levels Render Pass Scope Supported Queue Types Pipeline Type Primary Secondary Inside Graphics Graphics - Parameters:
commandBuffer
- the command buffer into which the command is recorded.buffer
- the buffer containing draw parameters.offset
- the byte offset intobuffer
where parameters begin.countBuffer
- the buffer containing the draw count.countBufferOffset
- the byte offset intocountBuffer
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 incountBuffer
andmaxDrawCount
.stride
- the byte stride between successive sets of draw parameters.
- If a
-
-