195 lines
8.6 KiB
Plaintext
195 lines
8.6 KiB
Plaintext
== Indirect Commands Generation
|
|
|
|
[open,refpage='vkCmdReserveSpaceForCommandsNVX',desc='Perform a reservation of command buffer space',type='protos']
|
|
--
|
|
|
|
Command space for generated commands recorded into a secondary command
|
|
buffer must: be reserved by calling:
|
|
|
|
include::../../api/protos/vkCmdReserveSpaceForCommandsNVX.txt[]
|
|
|
|
* pname:commandBuffer is the secondary command buffer in which the space
|
|
for device-generated commands is reserved.
|
|
* pname:pProcessCommandsInfo is a pointer to an instance of the
|
|
slink:vkCmdReserveSpaceForCommandsNVX structure containing parameters
|
|
affecting the reservation of command buffer space.
|
|
|
|
.Valid Usage
|
|
****
|
|
* [[VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-01329]]
|
|
The provided pname:commandBuffer must: not have had a prior space
|
|
reservation since its creation or the last reset.
|
|
* [[VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-01330]]
|
|
The state of the pname:commandBuffer must: be legal to execute all
|
|
commands within the sequence provided by the
|
|
pname:indirectCommandsLayout member of pname:pProcessCommandsInfo.
|
|
****
|
|
|
|
include::../../validity/protos/vkCmdReserveSpaceForCommandsNVX.txt[]
|
|
--
|
|
|
|
[open,refpage='VkCmdReserveSpaceForCommandsInfoNVX',desc='Structure specifying parameters for the reservation of command buffer space',type='structs']
|
|
--
|
|
|
|
include::../../api/structs/VkCmdReserveSpaceForCommandsInfoNVX.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:objectTable is the slink:VkObjectTableNVX to be used for the
|
|
generation process.
|
|
Only registered objects at the time
|
|
flink:vkCmdReserveSpaceForCommandsNVX is called, will be taken into
|
|
account for the reservation.
|
|
* pname:indirectCommandsLayout is the slink:VkIndirectCommandsLayoutNVX
|
|
that must: also be used at generation time.
|
|
* pname:maxSequencesCount is the maximum number of sequences for which
|
|
command buffer space will be reserved.
|
|
|
|
include::../../validity/structs/VkCmdReserveSpaceForCommandsInfoNVX.txt[]
|
|
--
|
|
|
|
The generated commands will behave as if they were recorded within the call
|
|
to fname:vkCmdReserveSpaceForCommandsNVX, that means they can inherit state
|
|
defined in the command buffer prior this call.
|
|
However, given the stateless nature of the generated sequences, they will
|
|
not affect commands after the reserved space.
|
|
Treat the state that can: be affected by the provided
|
|
sname:VkIndirectCommandsLayoutNVX as undefined:.
|
|
|
|
[open,refpage='vkCmdProcessCommandsNVX',desc='Performs the generation of commands on the device',type='protos']
|
|
--
|
|
|
|
The actual generation on the device is handled with:
|
|
|
|
include::../../api/protos/vkCmdProcessCommandsNVX.txt[]
|
|
|
|
* pname:commandBuffer is the primary command buffer in which the
|
|
generation process takes space.
|
|
* pname:pProcessCommandsInfo is a pointer to an instance of the
|
|
slink:VkCmdProcessCommandsInfoNVX structure containing parameters
|
|
affecting the processing of commands.
|
|
|
|
include::../../validity/protos/vkCmdProcessCommandsNVX.txt[]
|
|
--
|
|
|
|
[open,refpage='VkCmdProcessCommandsInfoNVX',desc='Structure specifying parameters for the generation of commands',type='structs']
|
|
--
|
|
|
|
include::../../api/structs/VkCmdProcessCommandsInfoNVX.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:objectTable is the slink:VkObjectTableNVX to be used for the
|
|
generation process.
|
|
Only registered objects at the time
|
|
flink:vkCmdReserveSpaceForCommandsNVX is called, will be taken into
|
|
account for the reservation.
|
|
* pname:indirectCommandsLayout is the slink:VkIndirectCommandsLayoutNVX
|
|
that provides the command sequence to generate.
|
|
* pname:indirectCommandsTokenCount defines the number of input tokens
|
|
used.
|
|
* pname:pIndirectCommandsTokens provides an array of
|
|
slink:VkIndirectCommandsTokenNVX that reference the input data for each
|
|
token command.
|
|
* pname:maxSequencesCount is the maximum number of sequences for which
|
|
command buffer space will be reserved.
|
|
If pname:sequencesCountBuffer is dlink:VK_NULL_HANDLE, this is also the
|
|
actual number of sequences generated.
|
|
* pname:targetCommandBuffer can: be the secondary slink:VkCommandBuffer in
|
|
which the commands should be recorded.
|
|
If pname:targetCommandBuffer is `NULL` an implicit reservation as well
|
|
as execution takes place on the processing sname:VkCommandBuffer.
|
|
* pname:sequencesCountBuffer can: be slink:VkBuffer from which the actual
|
|
amount of sequences is sourced from as ftext:uint32_t value.
|
|
* pname:sequencesCountOffset is the byte offset into
|
|
pname:sequencesCountBuffer where the count value is stored.
|
|
* pname:sequencesIndexBuffer must: be set if
|
|
pname:indirectCommandsLayout's
|
|
ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT is set and
|
|
provides the used sequence indices as ftext:uint32_t array.
|
|
Otherwise it must: be dlink:VK_NULL_HANDLE.
|
|
* pname:sequencesIndexOffset is the byte offset into
|
|
pname:sequencesIndexBuffer where the index values start.
|
|
|
|
|
|
.Valid Usage
|
|
****
|
|
* [[VUID-VkCmdProcessCommandsInfoNVX-objectTable-01331]]
|
|
The provided pname:objectTable must: include all objects referenced by
|
|
the generation process.
|
|
* [[VUID-VkCmdProcessCommandsInfoNVX-indirectCommandsTokenCount-01332]]
|
|
pname:indirectCommandsTokenCount must: match the
|
|
pname:indirectCommandsLayout's pname:tokenCount.
|
|
* [[VUID-VkCmdProcessCommandsInfoNVX-tokenType-01333]]
|
|
The pname:tokenType member of each entry in the
|
|
pname:pIndirectCommandsTokens array must: match the values used at
|
|
creation time of pname:indirectCommandsLayout
|
|
* [[VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-01334]]
|
|
If pname:targetCommandBuffer is provided, it must: have reserved command
|
|
space.
|
|
* [[VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-01335]]
|
|
If pname:targetCommandBuffer is provided, the pname:objectTable must:
|
|
match the reservation's objectTable and must: have had all referenced
|
|
objects registered at reservation time.
|
|
* [[VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-01336]]
|
|
If pname:targetCommandBuffer is provided, the
|
|
pname:indirectCommandsLayout must: match the reservation's
|
|
indirectCommandsLayout.
|
|
* [[VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-01337]]
|
|
If pname:targetCommandBuffer is provided, the pname:maxSequencesCount
|
|
must: not exceed the reservation's maxSequencesCount.
|
|
* [[VUID-VkCmdProcessCommandsInfoNVX-sequencesCountBuffer-01338]]
|
|
If pname:sequencesCountBuffer is used, its usage flag must: have
|
|
ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set.
|
|
* [[VUID-VkCmdProcessCommandsInfoNVX-sequencesCountBuffer-01339]]
|
|
If pname:sequencesCountBuffer is used, pname:sequencesCountOffset must:
|
|
be aligned to
|
|
sname:VkDeviceGeneratedCommandsLimitsNVX::pname:minSequenceCountBufferOffsetAlignment.
|
|
* [[VUID-VkCmdProcessCommandsInfoNVX-sequencesIndexBuffer-01340]]
|
|
If pname:sequencesIndexBuffer is used, its usage flag must: have
|
|
ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set.
|
|
* [[VUID-VkCmdProcessCommandsInfoNVX-sequencesIndexBuffer-01341]]
|
|
If pname:sequencesIndexBuffer is used, pname:sequencesIndexOffset must:
|
|
be aligned to
|
|
sname:VkDeviceGeneratedCommandsLimitsNVX::pname:minSequenceIndexBufferOffsetAlignment.
|
|
****
|
|
|
|
include::../../validity/structs/VkCmdProcessCommandsInfoNVX.txt[]
|
|
--
|
|
|
|
Referencing the functions defined in <<indirectmdslayout>>,
|
|
fname:vkCmdProcessCommandsNVX behaves as:
|
|
|
|
[source,c]
|
|
---------------------------------------------------
|
|
// For targetCommandBuffers the existing reservedSpace is reset & overwritten.
|
|
|
|
VkCommandBuffer cmd = targetCommandBuffer ?
|
|
targetCommandBuffer.reservedSpace :
|
|
commandBuffer;
|
|
|
|
uint32_t sequencesCount = sequencesCountBuffer ?
|
|
min(maxSequencesCount, sequencesCountBuffer.load_uint32(sequencesCountOffset) :
|
|
maxSequencesCount;
|
|
|
|
|
|
cmdProcessAllSequences(cmd, objectTable,
|
|
indirectCommandsLayout, pIndirectCommandsTokens,
|
|
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 state that may be affected through
|
|
generated commands must: be considered undefined: for the commands following
|
|
them.
|
|
It is not possible to setup generated state and provoking work that uses
|
|
this state outside of the generated sequence.
|
|
====
|