vkCmdDrawMeshTasksIndirectCountNV(3)

# vkCmdDrawMeshTasksIndirectCountNV(3) Manual Page

## Name

vkCmdDrawMeshTasksIndirectCountNV - Perform an indirect mesh tasks draw with the draw count sourced from a buffer

Loading… please wait.

## C Specification

To record an indirect mesh tasks draw with the draw count sourced from a buffer, call:

    // Provided by VK_NV_mesh_shader
    void vkCmdDrawMeshTasksIndirectCountNV(
        VkCommandBuffer                             commandBuffer,
        VkBuffer                                    buffer,
        VkDeviceSize                                offset,
        VkBuffer                                    countBuffer,
        VkDeviceSize                                countBufferOffset,
        uint32_t                                    maxDrawCount,
        uint32_t                                    stride);

## 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

`vkCmdDrawMeshTasksIndirectCountNV` behaves similarly to vkCmdDrawMeshTasksIndirectNV 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

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02690
  If a `VkImageView` is sampled with `VK_FILTER_LINEAR` as a result of this command, then the image view’s format features must contain `VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02691
  If a `VkImageView` is accessed using atomic operations as a result of this command, then the image view’s format features must contain `VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02692
  If a `VkImageView` is sampled with `VK_FILTER_CUBIC_EXT` as a result of this command, then the image view’s format features must contain `VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-filterCubic-02694
  Any VkImageView being sampled with `VK_FILTER_CUBIC_EXT` as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by `VkFilterCubicImageViewImageFormatPropertiesEXT`::`filterCubic` returned by `vkGetPhysicalDeviceImageFormatProperties2`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-filterCubicMinmax-02695
  Any VkImageView being sampled with `VK_FILTER_CUBIC_EXT` with a reduction mode of either `VK_SAMPLER_REDUCTION_MODE_MIN` or `VK_SAMPLER_REDUCTION_MODE_MAX` as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by `VkFilterCubicImageViewImageFormatPropertiesEXT`::`filterCubicMinmax` returned by `vkGetPhysicalDeviceImageFormatProperties2`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-flags-02696
  Any VkImage created with a VkImageCreateInfo::`flags` containing `VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV` sampled as a result of this command must only be sampled using a VkSamplerAddressMode of `VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697
  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 a `VkPipelineLayout` that is compatible for set n, with the `VkPipelineLayout` used to create the current `VkPipeline`, as described in [descriptorsets-compatibility]

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02698
  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 a `VkPipelineLayout` that is compatible for push constants, with the `VkPipelineLayout` used to create the current `VkPipeline`, as described in [descriptorsets-compatibility]

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02699
  Descriptors in each bound descriptor set, specified via `vkCmdBindDescriptorSets`, must be valid if they are statically used by the `VkPipeline` bound to the pipeline bind point used by this command

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700
  A valid pipeline must be bound to the pipeline bind point used by this command

- VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701
  If the `VkPipeline` 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

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02859
  There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the `VkPipeline` object bound to the pipeline bind point used by this command, since that pipeline was bound

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02702
  If the `VkPipeline` object bound to the pipeline bind point used by this command accesses a `VkSampler` object that uses unnormalized coordinates, that sampler 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

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02703
  If the `VkPipeline` object bound to the pipeline bind point used by this command accesses a `VkSampler` object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V `OpImageSample*` or `OpImageSparseSample*` instructions with `ImplicitLod`, `Dref` or `Proj` in their name, in any shader stage

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02704
  If the `VkPipeline` object bound to the pipeline bind point used by this command accesses a `VkSampler` object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V `OpImageSample*` or `OpImageSparseSample*` instructions that includes a LOD bias or any offset values, in any shader stage

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02705
  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

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02706
  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

- VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02707
  If `commandBuffer` is an unprotected command buffer, any resource accessed by the `VkPipeline` object bound to the pipeline bind point used by this command must not be a protected resource

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-04115
  If a `VkImageView` is accessed using `OpImageWrite` as a result of this command, then the `Type` of the `Texel` operand of that instruction must have at least as many components as the image view’s format.

- VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684
  The current render pass must be compatible with the `renderPass` member of the `VkGraphicsPipelineCreateInfo` structure specified when creating the `VkPipeline` bound to `VK_PIPELINE_BIND_POINT_GRAPHICS`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685
  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`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02686
  Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02687
  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

- VUID-vkCmdDrawMeshTasksIndirectCountNV-maxMultiviewInstanceIndex-02688
  If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::`maxMultiviewInstanceIndex`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689
  If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::`sampleLocationsEnable` set to `VK_TRUE` and the current subpass has a depth/stencil attachment, then that attachment must have been created with the `VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT` bit set

- VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03417
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT` dynamic state enabled, but not the `VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT` dynamic state enabled, then vkCmdSetViewportWithCountEXT must have been called in the current command buffer prior to this draw command, and the `viewportCount` parameter of `vkCmdSetViewportWithCountEXT` must match the `VkPipelineViewportStateCreateInfo`::`scissorCount` of the pipeline

- VUID-vkCmdDrawMeshTasksIndirectCountNV-scissorCount-03418
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT` dynamic state enabled, but not the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT` dynamic state enabled, then vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the `scissorCount` parameter of `vkCmdSetScissorWithCountEXT` must match the `VkPipelineViewportStateCreateInfo`::`viewportCount` of the pipeline

- VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03419
  If the bound graphics pipeline state was created with both the `VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT` and `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT` dynamic states enabled then both vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the `viewportCount` parameter of `vkCmdSetViewportWithCountEXT` must match the `scissorCount` parameter of `vkCmdSetScissorWithCountEXT`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-04137
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT` dynamic state enabled, but not the `VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV` dynamic state enabled, then the bound graphics pipeline must have been created with VkPipelineViewportWScalingStateCreateInfoNV::`viewportCount` greater or equal to the `viewportCount` parameter in the last call to vkCmdSetViewportWithCountEXT

- VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-04138
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT` and `VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV` dynamic states enabled then the `viewportCount` parameter in the last call to vkCmdSetViewportWScalingNV must be greater than or equal to the `viewportCount` parameter in the last call to vkCmdSetViewportWithCountEXT

- VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-04139
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT` dynamic state enabled, but not the `VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV` dynamic state enabled, then the bound graphics pipeline must have been created with VkPipelineViewportShadingRateImageStateCreateInfoNV::`viewportCount` greater or equal to the `viewportCount` parameter in the last call to vkCmdSetViewportWithCountEXT

- VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-04140
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT` and `VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV` dynamic states enabled then the `viewportCount` parameter in the last call to vkCmdSetViewportShadingRatePaletteNV must be greater than or equal to the `viewportCount` parameter in the last call to vkCmdSetViewportWithCountEXT

- VUID-vkCmdDrawMeshTasksIndirectCountNV-VkPipelineVieportCreateInfo-04141
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT` dynamic state enabled and an instance of VkPipelineViewportSwizzleStateCreateInfoNV chained from `VkPipelineVieportCreateInfo`, then the bound graphics pipeline must have been created with VkPipelineViewportSwizzleStateCreateInfoNV::`viewportCount` greater or equal to the `viewportCount` parameter in the last call to vkCmdSetViewportWithCountEXT

- VUID-vkCmdDrawMeshTasksIndirectCountNV-VkPipelineVieportCreateInfo-04142
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT` dynamic state enabled and an instance of VkPipelineViewportExclusiveScissorStateCreateInfoNV chained from `VkPipelineVieportCreateInfo`, then the bound graphics pipeline must have been created with VkPipelineViewportExclusiveScissorStateCreateInfoNV::`exclusiveScissorCount` greater or equal to the `viewportCount` parameter in the last call to vkCmdSetViewportWithCountEXT

- VUID-vkCmdDrawMeshTasksIndirectCountNV-primitiveTopology-03420
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT` dynamic state enabled then vkCmdSetPrimitiveTopologyEXT must have been called in the current command buffer prior to this draw command, and the `primitiveTopology` parameter of `vkCmdSetPrimitiveTopologyEXT` must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::`topology` state

- VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708
  If `buffer` is non-sparse then it must be bound completely and contiguously to a single `VkDeviceMemory` object

- VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709
  `buffer` must have been created with the `VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT` bit set

- VUID-vkCmdDrawMeshTasksIndirectCountNV-offset-02710
  `offset` must be a multiple of `4`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02711
  `commandBuffer` must not be a protected command buffer

- VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714
  If `countBuffer` is non-sparse then it must be bound completely and contiguously to a single `VkDeviceMemory` object

- VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715
  `countBuffer` must have been created with the `VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT` bit set

- VUID-vkCmdDrawMeshTasksIndirectCountNV-countBufferOffset-02716
  `countBufferOffset` must be a multiple of `4`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02717
  The count stored in `countBuffer` must be less than or equal to `VkPhysicalDeviceLimits`::`maxDrawIndirectCount`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-countBufferOffset-04129
  (`countBufferOffset` + `sizeof`(uint32_t)) must be less than or equal to the size of `countBuffer`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-None-04445
  If drawIndirectCount is not enabled this function must not be used

- VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182
  `stride` must be a multiple of `4` and must be greater than or equal to `sizeof`(`VkDrawMeshTasksIndirectCommandNV`)

- VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183
  If `maxDrawCount` is greater than or equal to `1`, (`stride` × (`maxDrawCount` - 1) + `offset` + `sizeof`(`VkDrawMeshTasksIndirectCommandNV`)) must be less than or equal to the size of `buffer`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02191
  If the count stored in `countBuffer` is equal to `1`, (`offset` + `sizeof`(`VkDrawMeshTasksIndirectCommandNV`)) must be less than or equal to the size of `buffer`

- VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02192
  If the count stored in `countBuffer` is greater than `1`, (`stride` × (`drawCount` - 1) + `offset` + `sizeof`(`VkDrawMeshTasksIndirectCommandNV`)) must be less than or equal to the size of `buffer`

Valid Usage (Implicit)

- VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-parameter
  `commandBuffer` must be a valid VkCommandBuffer handle

- VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-parameter
  `buffer` must be a valid VkBuffer handle

- VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-parameter
  `countBuffer` must be a valid VkBuffer handle

- VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-recording
  `commandBuffer` must be in the recording state

- VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool
  The `VkCommandPool` that `commandBuffer` was allocated from must support graphics operations

- VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass
  This command must only be called inside of a render pass instance

- VUID-vkCmdDrawMeshTasksIndirectCountNV-commonparent
  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

Command Buffer Levels | Render Pass Scope | Supported Queue Types | Pipeline Type
--- | --- | --- | ---
Primary Secondary | Inside | Graphics | Graphics

## See Also

VkBuffer, VkCommandBuffer, `VkDeviceSize`

## Document Notes

For more information, see the Vulkan Specification

This page is extracted from the Vulkan Specification. Fixes and changes should be made to the Specification, not directly.

## Copyright

Copyright (c) 2014-2020 The Khronos Group Inc.

SPDX-License-Identifier: CC-BY-4.0