vkCmdDrawMultiIndexedEXT(3)

# vkCmdDrawMultiIndexedEXT(3) Manual Page

## Name

vkCmdDrawMultiIndexedEXT - Draw primitives

Loading… please wait.

## C Specification

To record an ordered sequence of indexed drawing operations which have no state changes between them, call:

    // Provided by VK_EXT_multi_draw
    void vkCmdDrawMultiIndexedEXT(
        VkCommandBuffer                             commandBuffer,
        uint32_t                                    drawCount,
        const VkMultiDrawIndexedInfoEXT*            pIndexInfo,
        uint32_t                                    instanceCount,
        uint32_t                                    firstInstance,
        uint32_t                                    stride,
        const int32_t*                              pVertexOffset);

## Parameters

- `commandBuffer` is the command buffer into which the command is recorded.

- `drawCount` is the number of draws to execute, and can be zero.

- `pIndexInfo` is a pointer to an array of VkMultiDrawIndexedInfoEXT with index information to be drawn.

- `instanceCount` is the number of instances to draw.

- `firstInstance` is the instance ID of the first instance to draw.

- `stride` is the byte stride between consecutive elements of `pIndexInfo`.

- `pVertexOffset` is `NULL` or a pointer to the value added to the vertex index before indexing into the vertex buffer. When specified, `VkMultiDrawIndexedInfoEXT`::`offset` is ignored.

## Description

`drawCount` indexed draws are executed with parameters taken from `pIndexInfo`. The number of draw commands recorded is `drawCount`, with each command reading, sequentially, a `firstIndex` and an `indexCount` from `pIndexInfo`. If `pVertexOffset` is `NULL`, a `vertexOffset` is also read from `pIndexInfo`, otherwise the value from dereferencing `pVertexOffset` is used.

Valid Usage

- VUID-vkCmdDrawMultiIndexedEXT-magFilter-04553
  If a VkSampler created with `magFilter` or `minFilter` equal to `VK_FILTER_LINEAR` and `compareEnable` equal to `VK_FALSE` is used to sample a VkImageView as a result of this command, then the image view’s format features must contain `VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT`

- VUID-vkCmdDrawMultiIndexedEXT-mipmapMode-04770
  If a VkSampler created with `mipmapMode` equal to `VK_SAMPLER_MIPMAP_MODE_LINEAR` and `compareEnable` equal to `VK_FALSE` is used to sample a VkImageView as a result of this command, then the image view’s format features must contain `VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT`

- VUID-vkCmdDrawMultiIndexedEXT-None-06479
  If a VkImageView is sampled with depth comparison, the image view’s format features must contain `VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT`

- VUID-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-OpTypeImage-06423
  Any VkImageView or VkBufferView being written as a storage image or storage texel buffer where the image format field of the `OpTypeImage` is `Unknown` then the view’s format feature must contain `VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT`

- VUID-vkCmdDrawMultiIndexedEXT-OpTypeImage-06424
  Any VkImageView or VkBufferView being read as a storage image or storage texel buffer where the image format field of the `OpTypeImage` is `Unknown` then the view’s format feature must contain `VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT`

- VUID-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-maintenance4-06425
  If the `maintenance4` feature is not enabled, then 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-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-None-02700
  A valid pipeline must be bound to the pipeline bind point used by this command

- VUID-vkCmdDrawMultiIndexedEXT-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 or inherited (if the `VK_NV_inherited_viewport_scissor` extension is enabled) for `commandBuffer`, and done so after any previously bound pipeline with the corresponding state not specified as dynamic

- VUID-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-commandBuffer-02707
  If `commandBuffer` is an unprotected command buffer and `protectedNoFault` is not supported, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource

- VUID-vkCmdDrawMultiIndexedEXT-None-06550
  If the `VkPipeline` object bound to the pipeline bind point used by this command accesses a `VkSampler` or `VkImageView` object that enables sampler Y′CBCR conversion, that object must only be used with `OpImageSample*` or `OpImageSparseSample*` instructions

- VUID-vkCmdDrawMultiIndexedEXT-ConstOffset-06551
  If the `VkPipeline` object bound to the pipeline bind point used by this command accesses a `VkSampler` or `VkImageView` object that enables sampler Y′CBCR conversion, that object must not use the `ConstOffset` and `Offset` operands

- VUID-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-OpImageWrite-04469
  If a VkBufferView 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 buffer view’s format

- VUID-vkCmdDrawMultiIndexedEXT-SampledType-04470
  If a VkImageView with a VkFormat that has a 64-bit component width is accessed as a result of this command, the `SampledType` of the `OpTypeImage` operand of that instruction must have a `Width` of 64

- VUID-vkCmdDrawMultiIndexedEXT-SampledType-04471
  If a VkImageView with a VkFormat that has a component width less than 64-bit is accessed as a result of this command, the `SampledType` of the `OpTypeImage` operand of that instruction must have a `Width` of 32

- VUID-vkCmdDrawMultiIndexedEXT-SampledType-04472
  If a VkBufferView with a VkFormat that has a 64-bit component width is accessed as a result of this command, the `SampledType` of the `OpTypeImage` operand of that instruction must have a `Width` of 64

- VUID-vkCmdDrawMultiIndexedEXT-SampledType-04473
  If a VkBufferView with a VkFormat that has a component width less than 64-bit is accessed as a result of this command, the `SampledType` of the `OpTypeImage` operand of that instruction must have a `Width` of 32

- VUID-vkCmdDrawMultiIndexedEXT-sparseImageInt64Atomics-04474
  If the `sparseImageInt64Atomics` feature is not enabled, VkImage objects created with the `VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT` flag must not be accessed by atomic instructions through an `OpTypeImage` with a `SampledType` with a `Width` of 64 by this command

- VUID-vkCmdDrawMultiIndexedEXT-sparseImageInt64Atomics-04475
  If the `sparseImageInt64Atomics` feature is not enabled, VkBuffer objects created with the `VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT` flag must not be accessed by atomic instructions through an `OpTypeImage` with a `SampledType` with a `Width` of 64 by this command

- VUID-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-None-02686
  Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set

- VUID-vkCmdDrawMultiIndexedEXT-None-06537
  Memory backing image subresources used as attachments in the current render pass must not be written in any way other than as an attachment by this command

- VUID-vkCmdDrawMultiIndexedEXT-None-06538
  If any recorded command in the current subpass will write to an image subresource as an attachment, this command must not read from the memory backing that image subresource in any other way than as an attachment

- VUID-vkCmdDrawMultiIndexedEXT-None-06539
  If any recorded command in the current subpass will read from an image subresource used as an attachment in any way other than as an attachment, this command must not write to that image subresource as an attachment

- VUID-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-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-vkCmdDrawMultiIndexedEXT-None-06666
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT` dynamic state enabled then vkCmdSetSampleLocationsEXT must have been called in the current command buffer prior to this drawing command

- VUID-vkCmdDrawMultiIndexedEXT-viewportCount-03417
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT` dynamic state enabled, but not the `VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT` dynamic state enabled, then vkCmdSetViewportWithCount must have been called in the current command buffer prior to this drawing command, and the `viewportCount` parameter of `vkCmdSetViewportWithCount` must match the `VkPipelineViewportStateCreateInfo`::`scissorCount` of the pipeline

- VUID-vkCmdDrawMultiIndexedEXT-scissorCount-03418
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT` dynamic state enabled, but not the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT` dynamic state enabled, then vkCmdSetScissorWithCount must have been called in the current command buffer prior to this drawing command, and the `scissorCount` parameter of `vkCmdSetScissorWithCount` must match the `VkPipelineViewportStateCreateInfo`::`viewportCount` of the pipeline

- VUID-vkCmdDrawMultiIndexedEXT-viewportCount-03419
  If the bound graphics pipeline state was created with both the `VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT` and `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT` dynamic states enabled then both vkCmdSetViewportWithCount and vkCmdSetScissorWithCount must have been called in the current command buffer prior to this drawing command, and the `viewportCount` parameter of `vkCmdSetViewportWithCount` must match the `scissorCount` parameter of `vkCmdSetScissorWithCount`

- VUID-vkCmdDrawMultiIndexedEXT-viewportCount-04137
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT` 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 vkCmdSetViewportWithCount

- VUID-vkCmdDrawMultiIndexedEXT-viewportCount-04138
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT` 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 vkCmdSetViewportWithCount

- VUID-vkCmdDrawMultiIndexedEXT-viewportCount-04139
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT` 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 vkCmdSetViewportWithCount

- VUID-vkCmdDrawMultiIndexedEXT-viewportCount-04140
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT` 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 vkCmdSetViewportWithCount

- VUID-vkCmdDrawMultiIndexedEXT-VkPipelineVieportCreateInfo-04141
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT` dynamic state enabled and a VkPipelineViewportSwizzleStateCreateInfoNV structure 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 vkCmdSetViewportWithCount

- VUID-vkCmdDrawMultiIndexedEXT-VkPipelineVieportCreateInfo-04142
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT` dynamic state enabled and a VkPipelineViewportExclusiveScissorStateCreateInfoNV structure 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 vkCmdSetViewportWithCount

- VUID-vkCmdDrawMultiIndexedEXT-None-04876
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE` dynamic state enabled then vkCmdSetRasterizerDiscardEnable must have been called in the current command buffer prior to this drawing command

- VUID-vkCmdDrawMultiIndexedEXT-None-04877
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE` dynamic state enabled then vkCmdSetDepthBiasEnable must have been called in the current command buffer prior to this drawing command

- VUID-vkCmdDrawMultiIndexedEXT-logicOp-04878
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_LOGIC_OP_EXT` dynamic state enabled then vkCmdSetLogicOpEXT must have been called in the current command buffer prior to this drawing command and the `logicOp` must be a valid VkLogicOp value

- VUID-vkCmdDrawMultiIndexedEXT-primitiveFragmentShadingRateWithMultipleViewports-04552
  If the `primitiveFragmentShadingRateWithMultipleViewports` limit is not supported, the bound graphics pipeline was created with the `VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT` dynamic state enabled, and any of the shader stages of the bound graphics pipeline write to the `PrimitiveShadingRateKHR` built-in, then vkCmdSetViewportWithCount must have been called in the current command buffer prior to this drawing command, and the `viewportCount` parameter of `vkCmdSetViewportWithCount` must be `1`

- VUID-vkCmdDrawMultiIndexedEXT-blendEnable-04727
  If rasterization is not disabled in the bound graphics pipeline, then for each color attachment in the subpass, if the corresponding image view’s format features do not contain `VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT`, then the `blendEnable` member of the corresponding element of the `pAttachments` member of `pColorBlendState` must be `VK_FALSE`

- VUID-vkCmdDrawMultiIndexedEXT-rasterizationSamples-04740
  If rasterization is not disabled in the bound graphics pipeline, and neither the `VK_AMD_mixed_attachment_samples` nor the `VK_NV_framebuffer_mixed_samples` extensions are enabled, then VkPipelineMultisampleStateCreateInfo::`rasterizationSamples` must be the same as the current subpass color and/or depth/stencil attachments

- VUID-vkCmdDrawMultiIndexedEXT-imageView-06172
  If the current render pass instance was begun with vkCmdBeginRendering, the `imageView` member of `pDepthAttachment` is not VK_NULL_HANDLE, and the `layout` member of `pDepthAttachment` is `VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL`, this command must not write any values to the depth attachment

- VUID-vkCmdDrawMultiIndexedEXT-imageView-06173
  If the current render pass instance was begun with vkCmdBeginRendering, the `imageView` member of `pStencilAttachment` is not VK_NULL_HANDLE, and the `layout` member of `pStencilAttachment` is `VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL`, this command must not write any values to the stencil attachment

- VUID-vkCmdDrawMultiIndexedEXT-imageView-06174
  If the current render pass instance was begun with vkCmdBeginRendering, the `imageView` member of `pDepthAttachment` is not VK_NULL_HANDLE, and the `layout` member of `pDepthAttachment` is `VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL`, this command must not write any values to the depth attachment

- VUID-vkCmdDrawMultiIndexedEXT-imageView-06175
  If the current render pass instance was begun with vkCmdBeginRendering, the `imageView` member of `pStencilAttachment` is not VK_NULL_HANDLE, and the `layout` member of `pStencilAttachment` is `VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL`, this command must not write any values to the stencil attachment

- VUID-vkCmdDrawMultiIndexedEXT-imageView-06176
  If the current render pass instance was begun with vkCmdBeginRendering, the `imageView` member of `pDepthAttachment` is not VK_NULL_HANDLE, and the `layout` member of `pDepthAttachment` is `VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL`, this command must not write any values to the depth attachment

- VUID-vkCmdDrawMultiIndexedEXT-imageView-06177
  If the current render pass instance was begun with vkCmdBeginRendering, the `imageView` member of `pStencilAttachment` is not VK_NULL_HANDLE, and the `layout` member of `pStencilAttachment` is `VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL`, this command must not write any values to the stencil attachment

- VUID-vkCmdDrawMultiIndexedEXT-viewMask-06178
  If the current render pass instance was begun with vkCmdBeginRendering, the currently bound graphics pipeline must have been created with a VkPipelineRenderingCreateInfo::`viewMask` equal to VkRenderingInfo::`viewMask`

- VUID-vkCmdDrawMultiIndexedEXT-colorAttachmentCount-06179
  If the current render pass instance was begun with vkCmdBeginRendering, the currently bound graphics pipeline must have been created with a VkPipelineRenderingCreateInfo::`colorAttachmentCount` equal to VkRenderingInfo::`colorAttachmentCount`

- VUID-vkCmdDrawMultiIndexedEXT-colorAttachmentCount-06180
  If the current render pass instance was begun with vkCmdBeginRendering and VkRenderingInfo::`colorAttachmentCount` greater than `0`, then each element of the VkRenderingInfo::`pColorAttachments` array with a `imageView` not equal to VK_NULL_HANDLE must have been created with a VkFormat equal to the corresponding element of VkPipelineRenderingCreateInfo::`pColorAttachmentFormats` used to create the currently bound graphics pipeline

- VUID-vkCmdDrawMultiIndexedEXT-attachmentCount-06667
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT` dynamic state enabled then vkCmdSetColorWriteEnableEXT must have been called in the current command buffer prior to this drawing command, and the `attachmentCount` parameter of `vkCmdSetColorWriteEnableEXT` must be equal to the `VkPipelineColorBlendStateCreateInfo`::`attachmentCount` of the currently bound graphics pipeline

- VUID-vkCmdDrawMultiIndexedEXT-pDepthAttachment-06181
  If the current render pass instance was begun with vkCmdBeginRendering and VkRenderingInfo::`pDepthAttachment->pname`:imageView was not VK_NULL_HANDLE, the value of VkPipelineRenderingCreateInfo::`depthAttachmentFormat` used to create the currently bound graphics pipeline must be equal to the VkFormat used to create VkRenderingInfo::`pDepthAttachment->pname`:imageView

- VUID-vkCmdDrawMultiIndexedEXT-pStencilAttachment-06182
  If the current render pass instance was begun with vkCmdBeginRendering and VkRenderingInfo::`pStencilAttachment->pname`:imageView was not VK_NULL_HANDLE, the value of VkPipelineRenderingCreateInfo::`stencilAttachmentFormat` used to create the currently bound graphics pipeline must be equal to the VkFormat used to create VkRenderingInfo::`pStencilAttachment->pname`:imageView

- VUID-vkCmdDrawMultiIndexedEXT-imageView-06183
  If the current render pass instance was begun with vkCmdBeginRendering and VkRenderingFragmentShadingRateAttachmentInfoKHR::`imageView` was not VK_NULL_HANDLE, the currently bound graphics pipeline must have been created with `VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR`

- VUID-vkCmdDrawMultiIndexedEXT-imageView-06184
  If the current render pass instance was begun with vkCmdBeginRendering and VkRenderingFragmentDensityMapAttachmentInfoEXT::`imageView` was not VK_NULL_HANDLE, the currently bound graphics pipeline must have been created with `VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT`

- VUID-vkCmdDrawMultiIndexedEXT-colorAttachmentCount-06185
  If the currently bound pipeline was created with a VkAttachmentSampleCountInfoAMD or VkAttachmentSampleCountInfoNV structure, and the current render pass instance was begun with vkCmdBeginRendering with a VkRenderingInfo::`colorAttachmentCount` parameter greater than `0`, then each element of the VkRenderingInfo::`pColorAttachments` array with a `imageView` not equal to VK_NULL_HANDLE must have been created with a sample count equal to the corresponding element of the `pColorAttachmentSamples` member of VkAttachmentSampleCountInfoAMD or VkAttachmentSampleCountInfoNV used to create the currently bound graphics pipeline

- VUID-vkCmdDrawMultiIndexedEXT-pDepthAttachment-06186
  If the current render pass instance was begun with vkCmdBeginRendering, the currently bound pipeline was created with a VkAttachmentSampleCountInfoAMD or VkAttachmentSampleCountInfoNV structure, and VkRenderingInfo::`pDepthAttachment->pname`:imageView was not VK_NULL_HANDLE, the value of the `depthStencilAttachmentSamples` member of VkAttachmentSampleCountInfoAMD or VkAttachmentSampleCountInfoNV used to create the currently bound graphics pipeline must be equal to the sample count used to create VkRenderingInfo::`pDepthAttachment->pname`:imageView

- VUID-vkCmdDrawMultiIndexedEXT-pStencilAttachment-06187
  If the current render pass instance was begun with vkCmdBeginRendering, the currently bound pipeline was created with a VkAttachmentSampleCountInfoAMD or VkAttachmentSampleCountInfoNV structure, and VkRenderingInfo::`pStencilAttachment->pname`:imageView was not VK_NULL_HANDLE, the value of the `depthStencilAttachmentSamples` member of VkAttachmentSampleCountInfoAMD or VkAttachmentSampleCountInfoNV used to create the currently bound graphics pipeline must be equal to the sample count used to create VkRenderingInfo::`pStencilAttachment->pname`:imageView

- VUID-vkCmdDrawMultiIndexedEXT-colorAttachmentCount-06188
  If the currently bound pipeline was created without a VkAttachmentSampleCountInfoAMD or VkAttachmentSampleCountInfoNV structure, and the current render pass instance was begun with vkCmdBeginRendering with a VkRenderingInfo::`colorAttachmentCount` parameter greater than `0`, then each element of the VkRenderingInfo::`pColorAttachments` array with a `imageView` not equal to VK_NULL_HANDLE must have been created with a sample count equal to the value of VkPipelineMultisampleStateCreateInfo::`rasterizationSamples` used to create the currently bound graphics pipeline

- VUID-vkCmdDrawMultiIndexedEXT-pDepthAttachment-06189
  If the current render pass instance was begun with vkCmdBeginRendering, the currently bound pipeline was created without a VkAttachmentSampleCountInfoAMD or VkAttachmentSampleCountInfoNV structure, and VkRenderingInfo::`pDepthAttachment->pname`:imageView was not VK_NULL_HANDLE, the value of VkPipelineMultisampleStateCreateInfo::`rasterizationSamples` used to create the currently bound graphics pipeline must be equal to the sample count used to create VkRenderingInfo::`pDepthAttachment->pname`:imageView

- VUID-vkCmdDrawMultiIndexedEXT-pStencilAttachment-06190
  If the current render pass instance was begun with vkCmdBeginRendering, the currently bound pipeline was created without a VkAttachmentSampleCountInfoAMD or VkAttachmentSampleCountInfoNV structure, and VkRenderingInfo::`pStencilAttachment->pname`:imageView was not VK_NULL_HANDLE, the value of VkPipelineMultisampleStateCreateInfo::`rasterizationSamples` used to create the currently bound graphics pipeline must be equal to the sample count used to create VkRenderingInfo::`pStencilAttachment->pname`:imageView

- VUID-vkCmdDrawMultiIndexedEXT-renderPass-06198
  If the current render pass instance was begun with vkCmdBeginRendering, the currently bound pipeline must have been created with a VkGraphicsPipelineCreateInfo::`renderPass` equal to VK_NULL_HANDLE

- VUID-vkCmdDrawMultiIndexedEXT-primitivesGeneratedQueryWithRasterizerDiscard-06708
  If the `primitivesGeneratedQueryWithRasterizerDiscard` feature is not enabled and the `VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT` query is active, rasterization discard must not be enabled.

- VUID-vkCmdDrawMultiIndexedEXT-primitivesGeneratedQueryWithNonZeroStreams-06709
  If the `primitivesGeneratedQueryWithNonZeroStreams` feature is not enabled and the `VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT` query is active, the bound graphics pipeline must not have been created with a non-zero value in `VkPipelineRasterizationStateStreamCreateInfoEXT`::`rasterizationStream`.

- VUID-vkCmdDrawMultiIndexedEXT-commandBuffer-02712
  If `commandBuffer` is a protected command buffer and `protectedNoFault` is not supported, any resource written to by the `VkPipeline` object bound to the pipeline bind point used by this command must not be an unprotected resource

- VUID-vkCmdDrawMultiIndexedEXT-commandBuffer-02713
  If `commandBuffer` is a protected command buffer and `protectedNoFault` is not supported, pipeline stages other than the framebuffer-space and compute stages in the `VkPipeline` object bound to the pipeline bind point used by this command must not write to any resource

- VUID-vkCmdDrawMultiIndexedEXT-commandBuffer-04617
  If any of the shader stages of the `VkPipeline` bound to the pipeline bind point used by this command uses the RayQueryKHR capability, then `commandBuffer` must not be a protected command buffer

- VUID-vkCmdDrawMultiIndexedEXT-None-04007
  All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point’s interface must have either valid or VK_NULL_HANDLE buffers bound

- VUID-vkCmdDrawMultiIndexedEXT-None-04008
  If the nullDescriptor feature is not enabled, all vertex input bindings accessed via vertex input variables declared in the vertex shader entry point’s interface must not be VK_NULL_HANDLE

- VUID-vkCmdDrawMultiIndexedEXT-None-02721
  For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in [fxvertex-input]

- VUID-vkCmdDrawMultiIndexedEXT-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 drawing command, and the `primitiveTopology` parameter of `vkCmdSetPrimitiveTopologyEXT` must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::`topology` state

- VUID-vkCmdDrawMultiIndexedEXT-None-04912
  If the bound graphics pipeline was created with both the `VK_DYNAMIC_STATE_VERTEX_INPUT_EXT` and `VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT` dynamic states enabled, then vkCmdSetVertexInputEXT must have been called in the current command buffer prior to this draw command

- VUID-vkCmdDrawMultiIndexedEXT-pStrides-04913
  If the bound graphics pipeline was created with the `VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT` dynamic state enabled, but not the `VK_DYNAMIC_STATE_VERTEX_INPUT_EXT` dynamic state enabled, then vkCmdBindVertexBuffers2EXT must have been called in the current command buffer prior to this draw command, and the `pStrides` parameter of vkCmdBindVertexBuffers2EXT must not be `NULL`

- VUID-vkCmdDrawMultiIndexedEXT-None-04914
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_VERTEX_INPUT_EXT` dynamic state enabled, then vkCmdSetVertexInputEXT must have been called in the current command buffer prior to this draw command

- VUID-vkCmdDrawMultiIndexedEXT-None-04875
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT` dynamic state enabled then vkCmdSetPatchControlPointsEXT must have been called in the current command buffer prior to this drawing command

- VUID-vkCmdDrawMultiIndexedEXT-None-04879
  If the bound graphics pipeline state was created with the `VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT` dynamic state enabled then vkCmdSetPrimitiveRestartEnableEXT must have been called in the current command buffer prior to this drawing command

- VUID-vkCmdDrawMultiIndexedEXT-stage-06481
  The bound graphics pipeline must not have been created with the VkPipelineShaderStageCreateInfo::`stage` member of an element of VkGraphicsPipelineCreateInfo::`pStages` set to `VK_SHADER_STAGE_TASK_BIT_NV` or `VK_SHADER_STAGE_MESH_BIT_NV`

- VUID-vkCmdDrawMultiIndexedEXT-None-04937
  The multiDraw feature must be enabled

- VUID-vkCmdDrawMultiIndexedEXT-firstIndex-04938
  (`indexSize` × (`firstIndex` + `indexCount`) + `offset`) must be less than or equal to the size of the bound index buffer, with `indexSize` being based on the type specified by `indexType`, where the index buffer, `indexType`, and `offset` are specified via `vkCmdBindIndexBuffer`

- VUID-vkCmdDrawMultiIndexedEXT-drawCount-04939
  `drawCount` must be less than `VkPhysicalDeviceMultiDrawPropertiesEXT`::`maxMultiDrawCount`

- VUID-vkCmdDrawMultiIndexedEXT-drawCount-04940
  If `drawCount` is greater than zero, `pIndexInfo` must be a valid pointer to memory containing one or more valid instances of VkMultiDrawIndexedInfoEXT structures

- VUID-vkCmdDrawMultiIndexedEXT-stride-04941
  `stride` must be a multiple of 4

Valid Usage (Implicit)

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

- VUID-vkCmdDrawMultiIndexedEXT-pVertexOffset-parameter
  If `pVertexOffset` is not `NULL`, `pVertexOffset` must be a valid pointer to a valid `int32_t` value

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

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

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

Host Synchronization

- Host access to `commandBuffer` must be externally synchronized

- Host access to the `VkCommandPool` that `commandBuffer` was allocated from must be externally synchronized

Command Properties

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

## See Also

VK_EXT_multi_draw, VkCommandBuffer, VkMultiDrawIndexedInfoEXT

## 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 2014-2022 The Khronos Group Inc.

SPDX-License-Identifier: CC-BY-4.0