## C Specification

The VkIndirectCommandsLayoutTokenNV structure specifies details to the function arguments that need to be known at layout creation time:

// Provided by VK_NV_device_generated_commands
typedef struct VkIndirectCommandsLayoutTokenNV {
VkStructureType                  sType;
const void*                      pNext;
VkIndirectCommandsTokenTypeNV    tokenType;
uint32_t                         stream;
uint32_t                         offset;
uint32_t                         vertexBindingUnit;
VkBool32                         vertexDynamicStride;
VkPipelineLayout                 pushconstantPipelineLayout;
uint32_t                         pushconstantOffset;
uint32_t                         pushconstantSize;
VkIndirectStateFlagsNV           indirectStateFlags;
uint32_t                         indexTypeCount;
const VkIndexType*               pIndexTypes;
const uint32_t*                  pIndexTypeValues;
} VkIndirectCommandsLayoutTokenNV;

## Members

• sType is the type of this structure.

• pNext is NULL or a pointer to a structure extending this structure.

• tokenType specifies the token command type.

• stream is the index of the input stream that contains the token argument data.

• offset is a relative starting offset within the input stream memory for the token argument data.

• vertexBindingUnit is used for the vertex buffer binding command.

• vertexDynamicStride sets if the vertex buffer stride is provided by the binding command rather than the current bound graphics pipeline state.

• pushconstantPipelineLayout is the VkPipelineLayout used for the push constant command.

• pushconstantShaderStageFlags are the shader stage flags used for the push constant command.

• pushconstantOffset is the offset used for the push constant command.

• pushconstantSize is the size used for the push constant command.

• indirectStateFlags are the active states for the state flag command.

• indexTypeCount is the optional size of the pIndexTypes and pIndexTypeValues array pairings. If not zero, it allows to register a custom uint32_t value to be treated as specific VkIndexType.

• pIndexTypes is the used VkIndexType for the corresponding uint32_t value entry in pIndexTypeValues.

## Description

Valid Usage
• stream must be smaller than VkIndirectCommandsLayoutCreateInfoNV::streamCount

• offset must be less than or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsTokenOffset

• If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV, vertexBindingUnit must stay within device supported limits for the appropriate commands

• If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, pushconstantPipelineLayout must be valid

• If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, pushconstantOffset must be a multiple of 4

• If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, pushconstantSize must be a multiple of 4

• If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, pushconstantOffset must be less than VkPhysicalDeviceLimits::maxPushConstantsSize

• If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, pushconstantSize must be less than or equal to VkPhysicalDeviceLimits::maxPushConstantsSize minus pushconstantOffset

• If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, for each byte in the range specified by pushconstantOffset and pushconstantSize and for each shader stage in pushconstantShaderStageFlags, there must be a push constant range in pushconstantPipelineLayout that includes that byte and that stage

• If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, for each byte in the range specified by pushconstantOffset and pushconstantSize and for each push constant range that overlaps that byte, pushconstantShaderStageFlags must include all stages in that push constant range’s VkPushConstantRange::pushconstantShaderStageFlags

• If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV, indirectStateFlags must not be ´0´

Valid Usage (Implicit)
• sType must be VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV

• pNext must be NULL

• tokenType must be a valid VkIndirectCommandsTokenTypeNV value

• If pushconstantPipelineLayout is not VK_NULL_HANDLE, pushconstantPipelineLayout must be a valid VkPipelineLayout handle

• pushconstantShaderStageFlags must be a valid combination of VkShaderStageFlagBits values

• indirectStateFlags must be a valid combination of VkIndirectStateFlagBitsNV values

• If indexTypeCount is not 0, pIndexTypes must be a valid pointer to an array of indexTypeCount valid VkIndexType values

• If indexTypeCount is not 0, pIndexTypeValues must be a valid pointer to an array of indexTypeCount uint32_t values