blob: e188d2e8765be5176991129f81c9d85b5dd40827 [file] [log] [blame]
// Copyright (c) 2019-2020 NVIDIA Corporation
//
// SPDX-License-Identifier: CC-BY-4.0
[[indirectmdslayout]]
== Indirect Commands Layout
[open,refpage='VkIndirectCommandsLayoutNV',desc='Opaque handle to an indirect commands layout object',type='handles']
--
The device-side command generation happens through an iterative processing
of an atomic sequence comprised of command tokens, which are represented by:
include::{generated}/api/handles/VkIndirectCommandsLayoutNV.txt[]
--
=== Creation and Deletion
[open,refpage='vkCreateIndirectCommandsLayoutNV',desc='Create an indirect command layout object',type='protos']
--
Indirect command layouts are created by:
include::{generated}/api/protos/vkCreateIndirectCommandsLayoutNV.txt[]
* pname:device is the logical device that creates the indirect command
layout.
* pname:pCreateInfo is a pointer to a
sname:VkIndirectCommandsLayoutCreateInfoNV structure containing
parameters affecting creation of the indirect command layout.
* pname:pAllocator controls host memory allocation as described in the
<<memory-allocation, Memory Allocation>> chapter.
* pname:pIndirectCommandsLayout is a pointer to a
sname:VkIndirectCommandsLayoutNV handle in which the resulting indirect
command layout is returned.
.Valid Usage
****
* [[VUID-vkCreateIndirectCommandsLayoutNV-deviceGeneratedCommands-02929]]
The <<features-deviceGeneratedCommands,
sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
feature must: be enabled
****
include::{generated}/validity/protos/vkCreateIndirectCommandsLayoutNV.txt[]
--
[open,refpage='VkIndirectCommandsLayoutCreateInfoNV',desc='Structure specifying the parameters of a newly created indirect commands layout object',type='structs']
--
The sname:VkIndirectCommandsLayoutCreateInfoNV structure is defined as:
include::{generated}/api/structs/VkIndirectCommandsLayoutCreateInfoNV.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:pipelineBindPoint is the elink:VkPipelineBindPoint that this
layout targets.
* pname:flags is a bitmask of
elink:VkIndirectCommandsLayoutUsageFlagBitsNV specifying usage hints of
this layout.
* pname:tokenCount is the length of the individual command sequence.
* pname:pTokens is an array describing each command token in detail.
See elink:VkIndirectCommandsTokenTypeNV and
slink:VkIndirectCommandsLayoutTokenNV below for details.
* pname:streamCount is the number of streams used to provide the token
inputs.
* pname:pStreamStrides is an array defining the byte stride for each input
stream.
The following code illustrates some of the flags:
[source,c]
~~~~
void cmdProcessAllSequences(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsTokens, sequencesCount, indexbuffer, indexbufferOffset)
{
for (s = 0; s < sequencesCount; s++)
{
sUsed = s;
if (indirectCommandsLayout.flags & VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV) {
sUsed = indexbuffer.load_uint32( sUsed * sizeof(uint32_t) + indexbufferOffset);
}
if (indirectCommandsLayout.flags & VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV) {
sUsed = incoherent_implementation_dependent_permutation[ sUsed ];
}
cmdProcessSequence( cmd, pipeline, indirectCommandsLayout, pIndirectCommandsTokens, sUsed );
}
}
~~~~
.Valid Usage
****
* [[VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-02930]]
The pname:pipelineBindPoint must: be
ename:VK_PIPELINE_BIND_POINT_GRAPHICS
* [[VUID-VkIndirectCommandsLayoutCreateInfoNV-tokenCount-02931]]
pname:tokenCount must: be greater than `0` and less than or equal to
sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxIndirectCommandsTokenCount
* [[VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02932]]
If pname:pTokens contains an entry of
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV it must: be the
first element of the array and there must: be only a single element of
such token type
* [[VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02933]]
If pname:pTokens contains an entry of
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV there must: be only
a single element of such token type
* [[VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02934]]
All state tokens in pname:pTokens must: occur prior work provoking
tokens (ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV,
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV,
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV)
* [[VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02935]]
The content of pname:pTokens must: include one single work provoking
token that is compatible with the pname:pipelineBindPoint
* [[VUID-VkIndirectCommandsLayoutCreateInfoNV-streamCount-02936]]
pname:streamCount must: be greater than `0` and less or equal to
sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxIndirectCommandsStreamCount
* [[VUID-VkIndirectCommandsLayoutCreateInfoNV-pStreamStrides-02937]]
each element of pname:pStreamStrides must: be greater than `0`and less
than or equal to
sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxIndirectCommandsStreamStride.
Furthermore the alignment of each token input must: be ensured
****
include::{generated}/validity/structs/VkIndirectCommandsLayoutCreateInfoNV.txt[]
--
[open,refpage='VkIndirectCommandsLayoutUsageFlagBitsNV',desc='Bitmask specifying allowed usage of an indirect commands layout',type='enums']
--
Bits which can: be set in
slink:VkIndirectCommandsLayoutCreateInfoNV::pname:flags, specifying usage
hints of an indirect command layout, are:
include::{generated}/api/enums/VkIndirectCommandsLayoutUsageFlagBitsNV.txt[]
* ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV
specifies that the layout is always used with the manual preprocessing
step through calling flink:vkCmdPreprocessGeneratedCommandsNV and
executed by flink:vkCmdExecuteGeneratedCommandsNV with `isPreprocessed`
set to ename:VK_TRUE.
* ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV
specifies that the input data for the sequences is not implicitly
indexed from 0..sequencesUsed but a user provided sname:VkBuffer
encoding the index is provided.
* ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV
specifies that the processing of sequences can: happen at an
implementation-dependent order, which is not: guaranteed to be coherent
using the same input data.
--
[open,refpage='VkIndirectCommandsLayoutUsageFlagsNV',desc='Bitmask of VkIndirectCommandsLayoutUsageFlagBitsNV',type='flags']
--
include::{generated}/api/flags/VkIndirectCommandsLayoutUsageFlagsNV.txt[]
tname:VkIndirectCommandsLayoutUsageFlagsNV is a bitmask type for setting a
mask of zero or more elink:VkIndirectCommandsLayoutUsageFlagBitsNV.
--
[open,refpage='vkDestroyIndirectCommandsLayoutNV',desc='Destroy an indirect commands layout',type='protos']
--
Indirect command layouts are destroyed by:
include::{generated}/api/protos/vkDestroyIndirectCommandsLayoutNV.txt[]
* pname:device is the logical device that destroys the layout.
* pname:indirectCommandsLayout is the layout to destroy.
* pname:pAllocator controls host memory allocation as described in the
<<memory-allocation, Memory Allocation>> chapter.
.Valid Usage
****
* [[VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02938]]
All submitted commands that refer to pname:indirectCommandsLayout must:
have completed execution
* [[VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02939]]
If sname:VkAllocationCallbacks were provided when
pname:indirectCommandsLayout was created, a compatible set of callbacks
must: be provided here
* [[VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02940]]
If no sname:VkAllocationCallbacks were provided when
pname:indirectCommandsLayout was created, pname:pAllocator must: be
`NULL`
* [[VUID-vkDestroyIndirectCommandsLayoutNV-deviceGeneratedCommands-02941]]
The <<features-deviceGeneratedCommands,
sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
feature must: be enabled
****
include::{generated}/validity/protos/vkDestroyIndirectCommandsLayoutNV.txt[]
--
=== Token Input Streams
[open,refpage='VkIndirectCommandsStreamNV',desc='Structure specifying input streams for generated command tokens',type='structs']
--
The sname:VkIndirectCommandsStreamNV structure specifies the input data for
one or more tokens at processing time.
include::{generated}/api/structs/VkIndirectCommandsStreamNV.txt[]
* pname:buffer specifies the slink:VkBuffer storing the functional
arguments for each sequence.
These arguments can: be written by the device.
* pname:offset specified an offset into pname:buffer where the arguments
start.
.Valid Usage
****
* [[VUID-VkIndirectCommandsStreamNV-buffer-02942]]
The pname:buffer's usage flag must: have the
ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set
* [[VUID-VkIndirectCommandsStreamNV-offset-02943]]
The pname:offset must: be aligned to
sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:minIndirectCommandsBufferOffsetAlignment
* [[VUID-VkIndirectCommandsStreamNV-buffer-02975]]
If pname:buffer is non-sparse then it must: be bound completely and
contiguously to a single sname:VkDeviceMemory object
****
include::{generated}/validity/structs/VkIndirectCommandsStreamNV.txt[]
--
The input streams can: contain raw `uint32_t` values, existing indirect
commands such as:
* slink:VkDrawIndirectCommand
* slink:VkDrawIndexedIndirectCommand
ifdef::VK_NV_mesh_shader[]
* slink:VkDrawMeshTasksIndirectCommandNV
endif::VK_NV_mesh_shader[]
or additional commands as listed below.
How the data is used is described in the next section.
[open,refpage='VkBindShaderGroupIndirectCommandNV',desc='Structure specifying input data for a single shader group command token',type='structs']
--
The sname:VkBindShaderGroupIndirectCommandNV structure specifies the input
data for the ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV token.
include::{generated}/api/structs/VkBindShaderGroupIndirectCommandNV.txt[]
* pname:index specifies which shader group of the current bound graphics
pipeline is used.
.Valid Usage
****
* [[VUID-VkBindShaderGroupIndirectCommandNV-None-02944]]
The current bound graphics pipeline, as well as the pipelines it may
reference, must: have been created with
ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV
* [[VUID-VkBindShaderGroupIndirectCommandNV-index-02945]]
The pname:index must: be within range of the accessible shader groups of
the current bound graphics pipeline.
See flink:vkCmdBindPipelineShaderGroupNV for further details
****
include::{generated}/validity/structs/VkBindShaderGroupIndirectCommandNV.txt[]
--
[open,refpage='VkBindIndexBufferIndirectCommandNV',desc='Structure specifying input data for a single index buffer command token',type='structs']
--
The sname:VkBindIndexBufferIndirectCommandNV structure specifies the input
data for the ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV token.
include::{generated}/api/structs/VkBindIndexBufferIndirectCommandNV.txt[]
* pname:bufferAddress specifies a physical address of the slink:VkBuffer
used as index buffer.
* pname:size is the byte size range which is available for this operation
from the provided address.
* pname:indexType is a elink:VkIndexType value specifying how indices are
treated.
Instead of the Vulkan enum values, a custom `uint32_t` value can: be
mapped to an elink:VkIndexType by specifying the
sname:VkIndirectCommandsLayoutTokenNV::pname:pIndexTypes and
sname:VkIndirectCommandsLayoutTokenNV::pname:pIndexTypeValues arrays.
.Valid Usage
****
* [[VUID-VkBindIndexBufferIndirectCommandNV-None-02946]]
The buffer's usage flag from which the address was acquired must: have
the ename:VK_BUFFER_USAGE_INDEX_BUFFER_BIT bit set
* [[VUID-VkBindIndexBufferIndirectCommandNV-bufferAddress-02947]]
The pname:bufferAddress must: be aligned to the pname:indexType used
* [[VUID-VkBindIndexBufferIndirectCommandNV-None-02948]]
Each element of the buffer from which the address was acquired and that
is non-sparse must: be bound completely and contiguously to a single
sname:VkDeviceMemory object
****
include::{generated}/validity/structs/VkBindIndexBufferIndirectCommandNV.txt[]
--
[open,refpage='VkBindVertexBufferIndirectCommandNV',desc='Structure specifying input data for a single vertex buffer command token',type='structs']
--
The sname:VkBindVertexBufferIndirectCommandNV structure specifies the input
data for the ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV token.
include::{generated}/api/structs/VkBindVertexBufferIndirectCommandNV.txt[]
* pname:bufferAddress specifies a physical address of the slink:VkBuffer
used as vertex input binding.
* pname:size is the byte size range which is available for this operation
from the provided address.
* pname:stride is the byte size stride for this vertex input binding as in
sname:VkVertexInputBindingDescription::pname:stride.
It is only used if
sname:VkIndirectCommandsLayoutTokenNV::pname:vertexDynamicStride was
set, otherwise the stride is inherited from the current bound graphics
pipeline.
.Valid Usage
****
* [[VUID-VkBindVertexBufferIndirectCommandNV-None-02949]]
The buffer's usage flag from which the address was acquired must: have
the ename:VK_BUFFER_USAGE_VERTEX_BUFFER_BIT bit set
* [[VUID-VkBindVertexBufferIndirectCommandNV-None-02950]]
Each element of the buffer from which the address was acquired and that
is non-sparse must: be bound completely and contiguously to a single
sname:VkDeviceMemory object
****
include::{generated}/validity/structs/VkBindVertexBufferIndirectCommandNV.txt[]
--
[open,refpage='VkSetStateFlagsIndirectCommandNV',desc='Structure specifying input data for a single state flag command token',type='structs']
--
The sname:VkSetStateFlagsIndirectCommandNV structure specifies the input
data for the ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV token.
Which state is changed depends on the elink:VkIndirectStateFlagBitsNV
specified at sname:VkIndirectCommandsLayoutNV creation time.
include::{generated}/api/structs/VkSetStateFlagsIndirectCommandNV.txt[]
* pname:data encodes packed state that this command alters.
** Bit `0`: If set represents ename:VK_FRONT_FACE_CLOCKWISE, otherwise
ename:VK_FRONT_FACE_COUNTER_CLOCKWISE
include::{generated}/validity/structs/VkSetStateFlagsIndirectCommandNV.txt[]
--
[open,refpage='VkIndirectStateFlagBitsNV',desc='Bitmask specifiying state that can be altered on the device',type='enums']
--
A subset of the graphics pipeline state can: be altered using indirect state
flags:
include::{generated}/api/enums/VkIndirectStateFlagBitsNV.txt[]
* ename:VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV allows to toggle the
elink:VkFrontFace rasterization state for subsequent draw operations.
--
[open,refpage='VkIndirectStateFlagsNV',desc='Bitmask of VkIndirectStateFlagBitsNV',type='flags']
--
include::{generated}/api/flags/VkIndirectStateFlagsNV.txt[]
tname:VkIndirectStateFlagsNV is a bitmask type for setting a mask of zero or
more elink:VkIndirectStateFlagBitsNV.
--
=== Tokenized Command Processing
The processing is in principle illustrated below:
[source,c]
---------------------------------------------------
void cmdProcessSequence(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsStreams, s)
{
for (t = 0; t < indirectCommandsLayout.tokenCount; t++)
{
uint32_t stream = indirectCommandsLayout.pTokens[t].stream;
uint32_t offset = indirectCommandsLayout.pTokens[t].offset;
uint32_t stride = indirectCommandsLayout.pStreamStrides[stream];
stream = pIndirectCommandsStreams[stream];
const void* input = stream.buffer.pointer( stream.offset + stride * s + offset )
// further details later
indirectCommandsLayout.pTokens[t].command (cmd, pipeline, input, s);
}
}
void cmdProcessAllSequences(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsStreams, sequencesCount)
{
for (s = 0; s < sequencesCount; s++)
{
cmdProcessSequence(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsStreams, s);
}
}
---------------------------------------------------
The processing of each sequence is considered stateless, therefore all state
changes must: occur prior work provoking commands within the sequence.
A single sequence is strictly targeting the elink:VkPipelineBindPoint it was
created with.
The primary input data for each token is provided through sname:VkBuffer
content at preprocessing using flink:vkCmdPreprocessGeneratedCommandsNV or
execution time using flink:vkCmdExecuteGeneratedCommandsNV, however some
functional arguments, for example binding sets, are specified at layout
creation time.
The input size is different for each token.
[open,refpage='VkIndirectCommandsTokenTypeNV',desc='Enum specifying token commands',type='enums']
--
Possible values of those elements of the
slink:VkIndirectCommandsLayoutCreateInfoNV::pname:pTokens array which
specify command tokens (other elements of the array specify command
parameters) are:
include::{generated}/api/enums/VkIndirectCommandsTokenTypeNV.txt[]
.Supported indirect command tokens
[width="80%",cols="67%,33%",options="header",align="center"]
|====
|Token type | Equivalent command
|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV | flink:vkCmdBindPipelineShaderGroupNV
|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV | -
|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV | flink:vkCmdBindIndexBuffer
|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV | flink:vkCmdBindVertexBuffers
|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV | flink:vkCmdPushConstants
|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV | flink:vkCmdDrawIndexedIndirect
|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV | flink:vkCmdDrawIndirect
ifdef::VK_NV_mesh_shader[]
|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV | flink:vkCmdDrawMeshTasksIndirectNV
endif::VK_NV_mesh_shader[]
|====
--
[open,refpage='VkIndirectCommandsLayoutTokenNV',desc='Struct specifying the details of an indirect command layout token',type='structs']
--
The sname:VkIndirectCommandsLayoutTokenNV structure specifies details to the
function arguments that need to be known at layout creation time:
include::{generated}/api/structs/VkIndirectCommandsLayoutTokenNV.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:tokenType specifies the token command type.
* pname:stream is the index of the input stream that contains the token
argument data.
* pname:offset is a relative starting offset within the input stream
memory for the token argument data.
* pname:vertexBindingUnit is used for the vertex buffer binding command.
* pname:vertexDynamicStride sets if the vertex buffer stride is provided
by the binding command rather than the current bound graphics pipeline
state.
* pname:pushconstantPipelineLayout is the sname:VkPipelineLayout used for
the push constant command.
* pname:pushconstantShaderStageFlags are the shader stage flags used for
the push constant command.
* pname:pushconstantOffset is the offset used for the push constant
command.
* pname:pushconstantSize is the size used for the push constant command.
* pname:indirectStateFlags are the active states for the state flag
command.
* pname:indexTypeCount is the optional size of the pname:pIndexTypes and
pname:pIndexTypeValues array pairings.
If not zero, it allows to register a custom `uint32_t` value to be
treated as specific ename:VkIndexType.
* pname:pIndexTypes is the used ename:VkIndexType for the corresponding
`uint32_t` value entry in pname:pIndexTypeValues.
.Valid Usage
****
* [[VUID-VkIndirectCommandsLayoutTokenNV-stream-02951]]
pname:stream must: be smaller than
sname:VkIndirectCommandsLayoutCreateInfoNV::pname:streamCount
* [[VUID-VkIndirectCommandsLayoutTokenNV-offset-02952]]
pname:offset must: be less than or equal to
sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxIndirectCommandsTokenOffset
* [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02976]]
If pname:tokenType is
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV,
pname:vertexBindingUnit must: stay within device supported limits for
the appropriate commands
* [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02977]]
If pname:tokenType is
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,
pname:pushconstantPipelineLayout must: be valid
* [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02978]]
If pname:tokenType is
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,
pname:pushconstantOffset must: be a multiple of `4`
* [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02979]]
If pname:tokenType is
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,
pname:pushconstantSize must: be a multiple of `4`
* [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02980]]
If pname:tokenType is
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,
pname:pushconstantOffset must: be less than
sname:VkPhysicalDeviceLimits::pname:maxPushConstantsSize
* [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02981]]
If pname:tokenType is
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,
pname:pushconstantSize must: be less than or equal to
sname:VkPhysicalDeviceLimits::pname:maxPushConstantsSize minus
pname:pushconstantOffset
* [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02982]]
If pname:tokenType is
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, for each byte in
the range specified by pname:pushconstantOffset and
pname:pushconstantSize and for each shader stage in
pname:pushconstantShaderStageFlags, there must: be a push constant range
in pname:pushconstantPipelineLayout that includes that byte and that
stage
* [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02983]]
If pname:tokenType is
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, for each byte in
the range specified by pname:pushconstantOffset and
pname:pushconstantSize and for each push constant range that overlaps
that byte, pname:pushconstantShaderStageFlags must: include all stages
in that push constant range's
slink:VkPushConstantRange::pname:stageFlags
* [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02984]]
If pname:tokenType is
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV,
pname:indirectStateFlags must: not be `0`
****
include::{generated}/validity/structs/VkIndirectCommandsLayoutTokenNV.txt[]
--
The following code provides detailed information on how an individual
sequence is processed.
For valid usage, all restrictions from the regular commands apply.
[source,c]
---------------------------------------------------
void cmdProcessSequence(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsStreams, s)
{
for (uint32_t t = 0; t < indirectCommandsLayout.tokenCount; t++){
token = indirectCommandsLayout.pTokens[t];
uint32_t stride = indirectCommandsLayout.pStreamStrides[token.stream];
stream = pIndirectCommandsStreams[token.stream];
uint32_t offset = stream.offset + stride * s + token.offset;
const void* input = stream.buffer.pointer( offset )
switch(input.type){
VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV:
VkBindShaderGroupIndirectCommandNV* bind = input;
vkCmdBindPipelineShaderGroupNV(cmd, indirectCommandsLayout.pipelineBindPoint,
pipeline, bind->groupIndex);
break;
VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV:
VkSetStateFlagsIndirectCommandNV* state = input;
if (token.indirectStateFlags & VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV){
if (state.data & (1 << 0)){
set VK_FRONT_FACE_CLOCKWISE;
} else {
set VK_FRONT_FACE_COUNTER_CLOCKWISE;
}
}
break;
VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV:
uint32_t* data = input;
vkCmdPushConstants(cmd,
token.pushconstantPipelineLayout
token.pushconstantStageFlags,
token.pushconstantOffset,
token.pushconstantSize, data);
break;
VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV:
VkBindIndexBufferIndirectCommandNV* data = input;
// the indexType may optionally be remapped
// from a custom uint32_t value, via
// VkIndirectCommandsLayoutTokenNV::pIndexTypeValues
vkCmdBindIndexBuffer(cmd,
deriveBuffer(data->bufferAddress),
deriveOffset(data->bufferAddress),
data->indexType);
break;
VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV:
VkBindVertexBufferIndirectCommandNV* data = input;
// if token.vertexDynamicStride is VK_TRUE
// then the stride for this binding is set
// using data->stride as well
vkCmdBindVertexBuffers(cmd,
token.vertexBindingUnit, 1,
&deriveBuffer(data->bufferAddress),
&deriveOffset(data->bufferAddress));
break;
VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV:
vkCmdDrawIndexedIndirect(cmd,
stream.buffer, offset, 1, 0);
break;
VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV:
vkCmdDrawIndirect(cmd,
stream.buffer,
offset, 1, 0);
break;
// only available if VK_NV_mesh_shader is supported
VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NV:
vkCmdDrawMeshTasksIndirectNV(cmd,
stream.buffer, offset, 1, 0);
break;
}
}
}
---------------------------------------------------