blob: 6574dd33071361ebfb868857768113bae97d429a [file] [log] [blame]
// Copyright (c) 2019-2020 NVIDIA Corporation
//
// SPDX-License-Identifier: CC-BY-4.0
== Indirect Commands Generation And Execution
[open,refpage='vkGetGeneratedCommandsMemoryRequirementsNV',desc='Retrieve the buffer allocation requirements for generated commands',type='protos']
--
The generation of commands on the device requires a `preprocess` buffer.
To retrieve the memory size and alignment requirements of a particular
execution state call:
include::{generated}/api/protos/vkGetGeneratedCommandsMemoryRequirementsNV.txt[]
* pname:device is the logical device that owns the buffer.
* pname:pInfo is a pointer to a
sname:VkGeneratedCommandsMemoryRequirementsInfoNV structure containing
parameters required for the memory requirements query.
* pname:pMemoryRequirements is a pointer to a slink:VkMemoryRequirements2
structure in which the memory requirements of the buffer object are
returned.
.Valid Usage
****
* [[VUID-vkGetGeneratedCommandsMemoryRequirementsNV-deviceGeneratedCommands-02906]]
The <<features-deviceGeneratedCommands,
sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
feature must: be enabled
****
include::{generated}/validity/protos/vkGetGeneratedCommandsMemoryRequirementsNV.txt[]
--
[open,refpage='VkGeneratedCommandsMemoryRequirementsInfoNV',desc='Structure specifying parameters for the reservation of preprocess buffer space',type='structs']
--
include::{generated}/api/structs/VkGeneratedCommandsMemoryRequirementsInfoNV.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 of the
pname:pipeline that this buffer memory is intended to be used with
during the execution.
* pname:pipeline is the slink:VkPipeline that this buffer memory is
intended to be used with during the execution.
* pname:indirectCommandsLayout is the slink:VkIndirectCommandsLayoutNV
that this buffer memory is intended to be used with.
* pname:maxSequencesCount is the maximum number of sequences that this
buffer memory in combination with the other state provided can: be used
with.
.Valid Usage
****
* [[VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-maxSequencesCount-02907]]
pname:maxSequencesCount must: be less or equal to
slink:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxIndirectSequenceCount
****
include::{generated}/validity/structs/VkGeneratedCommandsMemoryRequirementsInfoNV.txt[]
--
[open,refpage='vkCmdExecuteGeneratedCommandsNV',desc='Generate and execute commands on the device',type='protos']
--
:refpage: vkCmdExecuteGeneratedCommandsNV
The actual generation of commands as well as their execution on the device
is handled as single action with:
include::{generated}/api/protos/vkCmdExecuteGeneratedCommandsNV.txt[]
* pname:commandBuffer is the command buffer into which the command is
recorded.
* pname:isPreprocessed represents whether the input data has already been
preprocessed on the device.
If it is ename:VK_FALSE this command will implicitly trigger the
preprocessing step, otherwise not.
* pname:pGeneratedCommandsInfo is a pointer to a
slink:VkGeneratedCommandsInfoNV structure containing parameters
affecting the generation of commands.
.Valid Usage
****
include::{chapters}/commonvalidity/draw_common.txt[]
include::{chapters}/commonvalidity/draw_vertex_binding.txt[]
ifdef::VK_VERSION_1_1[]
* [[VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-02970]]
pname:commandBuffer must: not be a protected command buffer
endif::VK_VERSION_1_1[]
* [[VUID-vkCmdExecuteGeneratedCommandsNV-isPreprocessed-02908]]
If pname:isPreprocessed is ename:VK_TRUE then
flink:vkCmdPreprocessGeneratedCommandsNV must: have already been
executed on the device, using the same pname:pGeneratedCommandsInfo
content as well as the content of the input buffers it references (all
except slink:VkGeneratedCommandsInfoNV::pname:preprocessBuffer).
Furthermore pname:pGeneratedCommandsInfo`s pname:indirectCommandsLayout
must: have been created with the
ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV bit
set
* [[VUID-vkCmdExecuteGeneratedCommandsNV-pipeline-02909]]
sname:VkGeneratedCommandsInfoNV::pname:pipeline must: match the current
bound pipeline at
sname:VkGeneratedCommandsInfoNV::pname:pipelineBindPoint
ifdef::VK_EXT_transform_feedback[]
* [[VUID-vkCmdExecuteGeneratedCommandsNV-None-02910]]
Transform feedback must: not be active
endif::VK_EXT_transform_feedback[]
* [[VUID-vkCmdExecuteGeneratedCommandsNV-deviceGeneratedCommands-02911]]
The <<features-deviceGeneratedCommands,
sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
feature must: be enabled
****
include::{generated}/validity/protos/vkCmdExecuteGeneratedCommandsNV.txt[]
--
[open,refpage='VkGeneratedCommandsInfoNV',desc='Structure specifying parameters for the generation of commands',type='structs']
--
include::{generated}/api/structs/VkGeneratedCommandsInfoNV.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 used for the
pname:pipeline.
* pname:pipeline is the slink:VkPipeline used in the generation and
execution process.
* pname:indirectCommandsLayout is the slink:VkIndirectCommandsLayoutNV
that provides the command sequence to generate.
* pname:streamCount defines the number of input streams
* pname:pStreams is a pointer to an array of pname:streamCount
slink:VkIndirectCommandsStreamNV structures providing the input data for
the tokens used in pname:indirectCommandsLayout.
* pname:sequencesCount is the maximum number of sequences to reserve.
If pname:sequencesCountBuffer is dlink:VK_NULL_HANDLE, this is also the
actual number of sequences generated.
* pname:preprocessBuffer is the slink:VkBuffer that is used for
preprocessing the input data for execution.
If this structure is used with flink:vkCmdExecuteGeneratedCommandsNV
with its pname:isPreprocessed set to `VK_TRUE`, then the preprocessing
step is skipped and data is only read from this buffer.
* pname:preprocessOffset is the byte offset into pname:preprocessBuffer
where the preprocessed data is stored.
* pname:preprocessSize is the maximum byte size within the
pname:preprocessBuffer after the pname:preprocessOffset that is
available for preprocessing.
* pname:sequencesCountBuffer is a sname:VkBuffer in which the actual
number of sequences is provided as single code:uint32_t value.
* pname:sequencesCountOffset is the byte offset into
pname:sequencesCountBuffer where the count value is stored.
* pname:sequencesIndexBuffer is a sname:VkBuffer that encodes the used
sequence indices as code:uint32_t array.
* pname:sequencesIndexOffset is the byte offset into
pname:sequencesIndexBuffer where the index values start.
.Valid Usage
****
* [[VUID-VkGeneratedCommandsInfoNV-pipeline-02912]]
The provided pname:pipeline must: match the pipeline bound at execution
time
* [[VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02913]]
If the pname:indirectCommandsLayout uses a token of
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV, then the
pname:pipeline must: have been created with multiple shader groups
* [[VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02914]]
If the pname:indirectCommandsLayout uses a token of
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV, then the
pname:pipeline must: have been created with
ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV set in
sname:VkGraphicsPipelineCreateInfo::pname:flags
* [[VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02915]]
If the pname:indirectCommandsLayout uses a token of
ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, then the
pname:pipeline`s sname:VkPipelineLayout must: match the
slink:VkIndirectCommandsLayoutTokenNV::pname:pushconstantPipelineLayout
* [[VUID-VkGeneratedCommandsInfoNV-streamCount-02916]]
pname:streamCount must: match the pname:indirectCommandsLayout's
pname:streamCount
* [[VUID-VkGeneratedCommandsInfoNV-sequencesCount-02917]]
pname:sequencesCount must: be less or equal to
slink:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxIndirectSequenceCount
and
slink:VkGeneratedCommandsMemoryRequirementsInfoNV::pname:maxSequencesCount
that was used to determine the pname:preprocessSize
* [[VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-02918]]
pname:preprocessBuffer must: have the
ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set in its usage flag
* [[VUID-VkGeneratedCommandsInfoNV-preprocessOffset-02919]]
pname:preprocessOffset must: be aligned to
slink:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:minIndirectCommandsBufferOffsetAlignment
* [[VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-02971]]
If pname:preprocessBuffer is non-sparse then it must: be bound
completely and contiguously to a single sname:VkDeviceMemory object
* [[VUID-VkGeneratedCommandsInfoNV-preprocessSize-02920]]
pname:preprocessSize must: be at least equal to the memory requirement`s
size returned by flink:vkGetGeneratedCommandsMemoryRequirementsNV using
the matching inputs (pname:indirectCommandsLayout, ...) as within this
structure
* [[VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02921]]
pname:sequencesCountBuffer can: be set if the actual used count of
sequences is sourced from the provided buffer.
In that case the pname:sequencesCount serves as upper bound
* [[VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02922]]
If pname:sequencesCountBuffer is not dlink:VK_NULL_HANDLE, its usage
flag must: have the ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set
* [[VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02923]]
If pname:sequencesCountBuffer is not dlink:VK_NULL_HANDLE,
pname:sequencesCountOffset must: be aligned to
sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:minSequencesCountBufferOffsetAlignment
* [[VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02972]]
If pname:sequencesCountBuffer is not dlink:VK_NULL_HANDLE and is
non-sparse then it must: be bound completely and contiguously to a
single sname:VkDeviceMemory object
* [[VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02924]]
If pname:indirectCommandsLayout's
ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV is set,
pname:sequencesIndexBuffer must: be set otherwise it must: be
dlink:VK_NULL_HANDLE
* [[VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02925]]
If pname:sequencesIndexBuffer is not dlink:VK_NULL_HANDLE, its usage
flag must: have the ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set
* [[VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02926]]
If pname:sequencesIndexBuffer is not dlink:VK_NULL_HANDLE,
pname:sequencesIndexOffset must: be aligned to
sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:minSequencesIndexBufferOffsetAlignment
* [[VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02973]]
If pname:sequencesIndexBuffer is not dlink:VK_NULL_HANDLE and is
non-sparse then it must: be bound completely and contiguously to a
single sname:VkDeviceMemory object
****
include::{generated}/validity/structs/VkGeneratedCommandsInfoNV.txt[]
--
Referencing the functions defined in <<indirectmdslayout>>,
fname:vkCmdExecuteGeneratedCommandsNV behaves as:
[source,c]
---------------------------------------------------
uint32_t sequencesCount = sequencesCountBuffer ?
min(maxSequencesCount, sequencesCountBuffer.load_uint32(sequencesCountOffset) :
maxSequencesCount;
cmdProcessAllSequences(commandBuffer, pipeline,
indirectCommandsLayout, pIndirectCommandsStreams,
sequencesCount,
sequencesIndexBuffer, sequencesIndexOffset);
// The stateful commands within indirectCommandsLayout will not
// affect the state of subsequent commands in the target
// command buffer (cmd)
---------------------------------------------------
[NOTE]
.Note
====
It is important to note that the values of all state related to the
pname:pipelineBindPoint used are undefined: after this command.
====
[open,refpage='vkCmdPreprocessGeneratedCommandsNV',desc='Performs preprocessing for generated commands',type='protos']
--
Commands can: be preprocessed prior execution using the following command:
include::{generated}/api/protos/vkCmdPreprocessGeneratedCommandsNV.txt[]
* pname:commandBuffer is the command buffer which does the preprocessing.
* pname:pGeneratedCommandsInfo is a pointer to a
slink:VkGeneratedCommandsInfoNV structure containing parameters
affecting the preprocessing step.
.Valid Usage
****
ifdef::VK_VERSION_1_1[]
* [[VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-02974]]
pname:commandBuffer must: not be a protected command buffer
endif::VK_VERSION_1_1[]
* [[VUID-vkCmdPreprocessGeneratedCommandsNV-pGeneratedCommandsInfo-02927]]
pname:pGeneratedCommandsInfo`s pname:indirectCommandsLayout must: have
been created with the
ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV bit
set
* [[VUID-vkCmdPreprocessGeneratedCommandsNV-deviceGeneratedCommands-02928]]
The <<features-deviceGeneratedCommands,
sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
feature must: be enabled
****
include::{generated}/validity/protos/vkCmdPreprocessGeneratedCommandsNV.txt[]
--