908 lines
40 KiB
Plaintext
908 lines
40 KiB
Plaintext
// Copyright (c) 2015-2017 The Khronos Group Inc.
|
|
// Copyright notice at https://www.khronos.org/registry/speccopyright.html
|
|
|
|
[[commandbuffers]]
|
|
= Command Buffers
|
|
|
|
// refBegin VkCommandBuffer Opaque handle to a command buffer object
|
|
|
|
Command buffers are objects used to record commands which can: be
|
|
subsequently submitted to a device queue for execution.
|
|
There are two levels of command buffers - _primary command buffers_, which
|
|
can: execute secondary command buffers, and which are submitted to queues,
|
|
and _secondary command buffers_, which can: be executed by primary command
|
|
buffers, and which are not directly submitted to queues.
|
|
|
|
Command buffers are represented by sname:VkCommandBuffer handles:
|
|
|
|
include::../api/handles/VkCommandBuffer.txt[]
|
|
|
|
// refEnd VkCommandBuffer
|
|
|
|
Recorded commands include commands to bind pipelines and descriptor sets to
|
|
the command buffer, commands to modify dynamic state, commands to draw (for
|
|
graphics rendering), commands to dispatch (for compute), commands to execute
|
|
secondary command buffers (for primary command buffers only), commands to
|
|
copy buffers and images, and other commands.
|
|
|
|
[[commandbuffers-statereset]]
|
|
Each command buffer manages state independently of other command buffers.
|
|
There is no inheritance of state across primary and secondary command
|
|
buffers, or between secondary command buffers.
|
|
When a command buffer begins recording, all state in that command buffer is
|
|
undefined.
|
|
When secondary command buffer(s) are recorded to execute on a primary
|
|
command buffer, the secondary command buffer inherits no state from the
|
|
primary command buffer, and all state of the primary command buffer is
|
|
undefined after an execute secondary command buffer command is recorded.
|
|
There is one exception to this rule - if the primary command buffer is
|
|
inside a render pass instance, then the render pass and subpass state is not
|
|
disturbed by executing secondary command buffers.
|
|
Whenever the state of a command buffer is undefined, the application must:
|
|
set all relevant state on the command buffer before any state dependent
|
|
commands such as draws and dispatches are recorded, otherwise the behavior
|
|
of executing that command buffer is undefined.
|
|
|
|
Unless otherwise specified, and without explicit synchronization, the
|
|
various commands submitted to a queue via command buffers may: execute in
|
|
arbitrary order relative to each other, and/or concurrently.
|
|
Also, the memory side-effects of those commands may: not be directly visible
|
|
to other commands without explicit memory dependencies.
|
|
This is true within a command buffer, and across command buffers submitted
|
|
to a given queue.
|
|
See <<synchronization, the synchronization chapter>> for information on
|
|
<<synchronization-implicit, implicit>> and explicit synchronization between
|
|
commands.
|
|
|
|
Each command buffer is always in one of three states:
|
|
|
|
* _Initial state_: Before flink:vkBeginCommandBuffer.
|
|
Either flink:vkBeginCommandBuffer has never been called, or the command
|
|
buffer has been reset since it last recorded commands.
|
|
* _Recording state_: Between flink:vkBeginCommandBuffer and
|
|
flink:vkEndCommandBuffer.
|
|
The command buffer is in a state where it can: record commands.
|
|
* _Executable state_: After flink:vkEndCommandBuffer.
|
|
The command buffer is in a state where it has finished recording
|
|
commands and can: be executed.
|
|
|
|
_Resetting_ a command buffer is an operation that discards any previously
|
|
recorded commands and puts a command buffer in the initial state.
|
|
Resetting occurs as a result of flink:vkResetCommandBuffer or
|
|
flink:vkResetCommandPool, or as part of flink:vkBeginCommandBuffer (which
|
|
additionally puts the command buffer in the recording state).
|
|
|
|
|
|
[[commandbuffers-pools]]
|
|
== Command Pools
|
|
|
|
// refBegin VkCommandPool Opaque handle to a command pool object
|
|
|
|
Command pools are opaque objects that command buffer memory is allocated
|
|
from, and which allow the implementation to amortize the cost of resource
|
|
creation across multiple command buffers.
|
|
Command pools are externally synchronized, meaning that a command pool must:
|
|
not be used concurrently in multiple threads.
|
|
That includes use via recording commands on any command buffers allocated
|
|
from the pool, as well as operations that allocate, free, and reset command
|
|
buffers or the pool itself.
|
|
|
|
Command pools are represented by sname:VkCommandPool handles:
|
|
|
|
include::../api/handles/VkCommandPool.txt[]
|
|
|
|
// refEnd VkCommandPool
|
|
|
|
// refBegin vkCreateCommandPool Create a new command pool object
|
|
|
|
To create a command pool, call:
|
|
|
|
include::../api/protos/vkCreateCommandPool.txt[]
|
|
|
|
* pname:device is the logical device that creates the command pool.
|
|
* pname:pCreateInfo contains information used to create the command pool.
|
|
* pname:pAllocator controls host memory allocation as described in the
|
|
<<memory-allocation, Memory Allocation>> chapter.
|
|
* pname:pCommandPool points to a sname:VkCommandPool handle in which the
|
|
created pool is returned.
|
|
|
|
include::../validity/protos/vkCreateCommandPool.txt[]
|
|
|
|
// refBegin VkCommandPoolCreateInfo Structure specifying parameters of a newly created command pool
|
|
|
|
The sname:VkCommandPoolCreateInfo structure is defined as:
|
|
|
|
include::../api/structs/VkCommandPoolCreateInfo.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:flags is a bitmask indicating usage behavior for the pool and
|
|
command buffers allocated from it.
|
|
Bits which can: be set include:
|
|
+
|
|
--
|
|
// refBegin VkCommandPoolCreateFlagBits Bitmask specifying usage behavior for a command pool
|
|
include::../api/enums/VkCommandPoolCreateFlagBits.txt[]
|
|
--
|
|
+
|
|
** ename:VK_COMMAND_POOL_CREATE_TRANSIENT_BIT indicates that command
|
|
buffers allocated from the pool will be short-lived, meaning that they
|
|
will be reset or freed in a relatively short timeframe.
|
|
This flag may: be used by the implementation to control memory
|
|
allocation behavior within the pool.
|
|
** ename:VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT controls whether
|
|
command buffers allocated from the pool can: be individually reset.
|
|
If this flag is set, individual command buffers allocated from the pool
|
|
can: be reset either explicitly, by calling fname:vkResetCommandBuffer,
|
|
or implicitly, by calling fname:vkBeginCommandBuffer on an executable
|
|
command buffer.
|
|
If this flag is not set, then fname:vkResetCommandBuffer and
|
|
fname:vkBeginCommandBuffer (on an executable command buffer) must: not
|
|
be called on the command buffers allocated from the pool, and they can:
|
|
only be reset in bulk by calling fname:vkResetCommandPool.
|
|
* pname:queueFamilyIndex designates a queue family as described in section
|
|
<<devsandqueues-queueprops,Queue Family Properties>>.
|
|
All command buffers allocated from this command pool must: be submitted
|
|
on queues from the same queue family.
|
|
|
|
.Valid Usage
|
|
****
|
|
* pname:queueFamilyIndex must: be the index of a queue family available in
|
|
the calling command's pname:device parameter
|
|
****
|
|
|
|
include::../validity/structs/VkCommandPoolCreateInfo.txt[]
|
|
|
|
ifdef::VK_KHR_maintenance1[]
|
|
|
|
// refBegin vkTrimCommandPoolKHR Trim a command pool
|
|
|
|
To trim a command pool, call:
|
|
|
|
include::../api/protos/vkTrimCommandPoolKHR.txt[]
|
|
|
|
* pname:device is the logical device that owns the command pool.
|
|
* pname:commandPool is the command pool to trim.
|
|
* pname:flags is reserved for future use.
|
|
|
|
Trimming a command pool recycles unused memory from the command pool back to
|
|
the system.
|
|
Command buffers allocated from the pool are not affected by the command.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
This command provides applications with some control over the internal
|
|
memory allocations used by command pools.
|
|
|
|
Unused memory normally arises from command buffers that have been recorded
|
|
and later reset, such that they are no longer using the memory.
|
|
On reset, a command buffer can return memory to its command pool, but the
|
|
only way to release memory from a command pool to the system requires
|
|
calling flink:vkResetCommandPool, which cannot be executed while any command
|
|
buffers from that pool are still in use.
|
|
Subsequent recording operations into command buffers will re-use this memory
|
|
but since total memory requirements fluctuate over time, unused memory can
|
|
accumulate.
|
|
|
|
In this situation, trimming a command pool may: be useful to return unused
|
|
memory back to the system, returning the total outstanding memory allocated
|
|
by the pool back to a more "average" value.
|
|
|
|
Implementations utilize many internal allocation strategies that make it
|
|
impossible to guarantee that all unused memory is released back to the
|
|
system.
|
|
For instance, an implementation of a command pool may: involve allocating
|
|
memory in bulk from the system and sub-allocating from that memory.
|
|
In such an implementation any live command buffer that holds a reference to
|
|
a bulk allocation would prevent that allocation from being freed, even if
|
|
only a small proportion of the bulk allocation is in use.
|
|
|
|
In most cases trimming will result in a reduction in allocated but unused
|
|
memory, but it does not guarantee the "ideal" behaviour.
|
|
|
|
Trimming may: be an expensive operation, and should: not be called
|
|
frequently.
|
|
Trimming should: be treated as a way to relieve memory pressure after
|
|
application-known points when there exists enough unused memory that the
|
|
cost of trimming is "worth" it.
|
|
====
|
|
|
|
include::../validity/protos/vkTrimCommandPoolKHR.txt[]
|
|
|
|
endif::VK_KHR_maintenance1[]
|
|
|
|
// refBegin vkResetCommandPool Reset a command pool
|
|
|
|
To reset a command pool, call:
|
|
|
|
include::../api/protos/vkResetCommandPool.txt[]
|
|
|
|
* pname:device is the logical device that owns the command pool.
|
|
* pname:commandPool is the command pool to reset.
|
|
* pname:flags contains additional flags controlling the behavior of the
|
|
reset.
|
|
Bits which can: be set include:
|
|
+
|
|
--
|
|
// refBegin VkCommandPoolResetFlagBits Bitmask controlling behavior of a command pool reset
|
|
include::../api/enums/VkCommandPoolResetFlagBits.txt[]
|
|
--
|
|
+
|
|
If pname:flags includes ename:VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT,
|
|
resetting a command pool recycles all of the resources from the command pool
|
|
back to the system.
|
|
|
|
Resetting a command pool recycles all of the resources from all of the
|
|
command buffers allocated from the command pool back to the command pool.
|
|
All command buffers that have been allocated from the command pool are put
|
|
in the initial state.
|
|
|
|
.Valid Usage
|
|
****
|
|
* All sname:VkCommandBuffer objects allocated from pname:commandPool must:
|
|
not currently be pending execution
|
|
****
|
|
|
|
include::../validity/protos/vkResetCommandPool.txt[]
|
|
|
|
// refBegin vkDestroyCommandPool Destroy a command pool object
|
|
|
|
To destroy a command pool, call:
|
|
|
|
include::../api/protos/vkDestroyCommandPool.txt[]
|
|
|
|
* pname:device is the logical device that destroys the command pool.
|
|
* pname:commandPool is the handle of the command pool to destroy.
|
|
* pname:pAllocator controls host memory allocation as described in the
|
|
<<memory-allocation, Memory Allocation>> chapter.
|
|
|
|
When a pool is destroyed, all command buffers allocated from the pool are
|
|
implicitly freed and become invalid.
|
|
Command buffers allocated from a given pool do not need to be freed before
|
|
destroying that command pool.
|
|
|
|
.Valid Usage
|
|
****
|
|
* All sname:VkCommandBuffer objects allocated from pname:commandPool must:
|
|
not be pending execution
|
|
* If sname:VkAllocationCallbacks were provided when pname:commandPool was
|
|
created, a compatible set of callbacks must: be provided here
|
|
* If no sname:VkAllocationCallbacks were provided when pname:commandPool
|
|
was created, pname:pAllocator must: be `NULL`
|
|
****
|
|
|
|
include::../validity/protos/vkDestroyCommandPool.txt[]
|
|
|
|
|
|
[[commandbuffer-allocation]]
|
|
== Command Buffer Allocation and Management
|
|
|
|
// refBegin vkAllocateCommandBuffers Allocate command buffers from an existing command pool
|
|
|
|
To allocate command buffers, call:
|
|
|
|
include::../api/protos/vkAllocateCommandBuffers.txt[]
|
|
|
|
* pname:device is the logical device that owns the command pool.
|
|
* pname:pAllocateInfo is a pointer to an instance of the
|
|
sname:VkCommandBufferAllocateInfo structure describing parameters of the
|
|
allocation.
|
|
* pname:pCommandBuffers is a pointer to an array of sname:VkCommandBuffer
|
|
handles in which the resulting command buffer objects are returned.
|
|
The array must: be at least the length specified by the
|
|
pname:commandBufferCount member of pname:pAllocateInfo.
|
|
Each allocated command buffer begins in the initial state.
|
|
|
|
ifdef::VK_KHR_maintenance1[]
|
|
fname:vkAllocateCommandBuffers can: be used to create multiple command
|
|
buffers.
|
|
If the creation of any of those command buffers fails, the implementation
|
|
must: destroy all successfully created command buffer objects from this
|
|
command, set all entries of the pname:pCommandBuffers array to
|
|
dlink:VK_NULL_HANDLE and return the error.
|
|
endif::VK_KHR_maintenance1[]
|
|
|
|
include::../validity/protos/vkAllocateCommandBuffers.txt[]
|
|
|
|
// refBegin VkCommandBufferAllocateInfo Structure specifying the allocation parameters for command buffer object
|
|
|
|
The sname:VkCommandBufferAllocateInfo structure is defined as:
|
|
|
|
include::../api/structs/VkCommandBufferAllocateInfo.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:commandPool is the command pool from which the command buffers are
|
|
allocated.
|
|
* pname:level determines whether the command buffers are primary or
|
|
secondary command buffers.
|
|
Possible values include:
|
|
+
|
|
--
|
|
// refBegin VkCommandBufferLevel Structure specifying a command buffer level
|
|
include::../api/enums/VkCommandBufferLevel.txt[]
|
|
--
|
|
+
|
|
* pname:commandBufferCount is the number of command buffers to allocate
|
|
from the pool.
|
|
|
|
.Valid Usage
|
|
****
|
|
* pname:commandBufferCount must: be greater than `0`
|
|
****
|
|
|
|
include::../validity/structs/VkCommandBufferAllocateInfo.txt[]
|
|
|
|
// refBegin vkResetCommandBuffer Reset a command buffer
|
|
|
|
To reset command buffers, call:
|
|
|
|
include::../api/protos/vkResetCommandBuffer.txt[]
|
|
|
|
* pname:commandBuffer is the command buffer to reset.
|
|
The command buffer can: be in any state, and is put in the initial
|
|
state.
|
|
* pname:flags is a bitmask controlling the reset operation.
|
|
Bits which can: be set include:
|
|
+
|
|
--
|
|
// refBegin VkCommandBufferResetFlagBits Bitmask controlling behavior of a command buffer reset
|
|
include::../api/enums/VkCommandBufferResetFlagBits.txt[]
|
|
--
|
|
+
|
|
If pname:flags includes ename:VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT,
|
|
then most or all memory resources currently owned by the command buffer
|
|
should: be returned to the parent command pool.
|
|
If this flag is not set, then the command buffer may: hold onto memory
|
|
resources and reuse them when recording commands.
|
|
|
|
.Valid Usage
|
|
****
|
|
* pname:commandBuffer must: not currently be pending execution
|
|
* pname:commandBuffer must: have been allocated from a pool that was
|
|
created with the ename:VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
|
|
****
|
|
|
|
include::../validity/protos/vkResetCommandBuffer.txt[]
|
|
|
|
// refBegin vkFreeCommandBuffers Free command buffers
|
|
|
|
To free command buffers, call:
|
|
|
|
include::../api/protos/vkFreeCommandBuffers.txt[]
|
|
|
|
* pname:device is the logical device that owns the command pool.
|
|
* pname:commandPool is the command pool from which the command buffers
|
|
were allocated.
|
|
* pname:commandBufferCount is the length of the pname:pCommandBuffers
|
|
array.
|
|
* pname:pCommandBuffers is an array of handles of command buffers to free.
|
|
|
|
.Valid Usage
|
|
****
|
|
* All elements of pname:pCommandBuffers must: not be pending execution
|
|
* pname:pCommandBuffers must: be a pointer to an array of
|
|
pname:commandBufferCount sname:VkCommandBuffer handles, each element of
|
|
which must: either be a valid handle or code:NULL
|
|
****
|
|
|
|
include::../validity/protos/vkFreeCommandBuffers.txt[]
|
|
|
|
|
|
[[commandbuffers-recording]]
|
|
== Command Buffer Recording
|
|
|
|
// refBegin vkBeginCommandBuffer Start recording a command buffer
|
|
|
|
To begin recording a command buffer, call:
|
|
|
|
include::../api/protos/vkBeginCommandBuffer.txt[]
|
|
|
|
* pname:commandBuffer is the handle of the command buffer which is to be
|
|
put in the recording state.
|
|
* pname:pBeginInfo is an instance of the sname:VkCommandBufferBeginInfo
|
|
structure, which defines additional information about how the command
|
|
buffer begins recording.
|
|
|
|
.Valid Usage
|
|
****
|
|
* pname:commandBuffer must: not be in the recording state
|
|
* pname:commandBuffer must: not currently be pending execution
|
|
* If pname:commandBuffer was allocated from a sname:VkCommandPool which
|
|
did not have the ename:VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
|
|
flag set, pname:commandBuffer must: be in the initial state
|
|
* If pname:commandBuffer is a secondary command buffer, the
|
|
pname:pInheritanceInfo member of pname:pBeginInfo must: be a valid
|
|
sname:VkCommandBufferInheritanceInfo structure
|
|
* If pname:commandBuffer is a secondary command buffer and either the
|
|
pname:occlusionQueryEnable member of the pname:pInheritanceInfo member
|
|
of pname:pBeginInfo is ename:VK_FALSE, or the precise occlusion queries
|
|
feature is not enabled, the pname:queryFlags member of the
|
|
pname:pInheritanceInfo member pname:pBeginInfo must: not contain
|
|
ename:VK_QUERY_CONTROL_PRECISE_BIT
|
|
****
|
|
|
|
include::../validity/protos/vkBeginCommandBuffer.txt[]
|
|
|
|
// refBegin VkCommandBufferBeginInfo Structure specifying a command buffer begin operation
|
|
|
|
The sname:VkCommandBufferBeginInfo structure is defined as:
|
|
|
|
include::../api/structs/VkCommandBufferBeginInfo.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:flags is a bitmask indicating usage behavior for the command
|
|
buffer.
|
|
Bits which can: be set include:
|
|
+
|
|
--
|
|
// refBegin VkCommandBufferUsageFlagBits Bitmask specifying usage behavior for command buffer
|
|
include::../api/enums/VkCommandBufferUsageFlagBits.txt[]
|
|
--
|
|
+
|
|
** ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT indicates that each
|
|
recording of the command buffer will only be submitted once, and the
|
|
command buffer will be reset and recorded again between each
|
|
submission.
|
|
** ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT indicates that a
|
|
secondary command buffer is considered to be entirely inside a render
|
|
pass.
|
|
If this is a primary command buffer, then this bit is ignored.
|
|
** Setting ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT allows the
|
|
command buffer to be resubmitted to a queue or recorded into a primary
|
|
command buffer while it is pending execution.
|
|
* pname:pInheritanceInfo is a pointer to a
|
|
sname:VkCommandBufferInheritanceInfo structure, which is used if
|
|
pname:commandBuffer is a secondary command buffer.
|
|
If this is a primary command buffer, then this value is ignored.
|
|
|
|
.Valid Usage
|
|
****
|
|
* If pname:flags contains
|
|
ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the
|
|
pname:renderPass member of pname:pInheritanceInfo must: be a valid
|
|
sname:VkRenderPass
|
|
* If pname:flags contains
|
|
ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the
|
|
pname:subpass member of pname:pInheritanceInfo must: be a valid subpass
|
|
index within the pname:renderPass member of pname:pInheritanceInfo
|
|
* If pname:flags contains
|
|
ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the
|
|
pname:framebuffer member of pname:pInheritanceInfo must: be either
|
|
dlink:VK_NULL_HANDLE, or a valid sname:VkFramebuffer that is compatible
|
|
with the pname:renderPass member of pname:pInheritanceInfo
|
|
****
|
|
|
|
include::../validity/structs/VkCommandBufferBeginInfo.txt[]
|
|
|
|
// refBegin VkCommandBufferInheritanceInfo Structure specifying command buffer inheritance info
|
|
|
|
If the command buffer is a secondary command buffer, then the
|
|
sname:VkCommandBufferInheritanceInfo structure defines any state that will
|
|
be inherited from the primary command buffer:
|
|
|
|
include::../api/structs/VkCommandBufferInheritanceInfo.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:renderPass is a sname:VkRenderPass object defining which render
|
|
passes the sname:VkCommandBuffer will be <<renderpass-compatibility,
|
|
compatible>> with and can: be executed within.
|
|
If the sname:VkCommandBuffer will not be executed within a render pass
|
|
instance, pname:renderPass is ignored.
|
|
* pname:subpass is the index of the subpass within the render pass
|
|
instance that the sname:VkCommandBuffer will be executed within.
|
|
If the sname:VkCommandBuffer will not be executed within a render pass
|
|
instance, pname:subpass is ignored.
|
|
* pname:framebuffer optionally refers to the sname:VkFramebuffer object
|
|
that the sname:VkCommandBuffer will be rendering to if it is executed
|
|
within a render pass instance.
|
|
It can: be dlink:VK_NULL_HANDLE if the framebuffer is not known, or if
|
|
the sname:VkCommandBuffer will not be executed within a render pass
|
|
instance.
|
|
+
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
Specifying the exact framebuffer that the secondary command buffer will be
|
|
executed with may: result in better performance at command buffer execution
|
|
time.
|
|
====
|
|
* pname:occlusionQueryEnable indicates whether the command buffer can: be
|
|
executed while an occlusion query is active in the primary command
|
|
buffer.
|
|
If this is ename:VK_TRUE, then this command buffer can: be executed
|
|
whether the primary command buffer has an occlusion query active or not.
|
|
If this is ename:VK_FALSE, then the primary command buffer must: not
|
|
have an occlusion query active.
|
|
* pname:queryFlags indicates the query flags that can: be used by an
|
|
active occlusion query in the primary command buffer when this secondary
|
|
command buffer is executed.
|
|
If this value includes the ename:VK_QUERY_CONTROL_PRECISE_BIT bit, then
|
|
the active query can: return boolean results or actual sample counts.
|
|
If this bit is not set, then the active query must: not use the
|
|
ename:VK_QUERY_CONTROL_PRECISE_BIT bit.
|
|
* pname:pipelineStatistics indicates the set of pipeline statistics that
|
|
can: be counted by an active query in the primary command buffer when
|
|
this secondary command buffer is executed.
|
|
If this value includes a given bit, then this command buffer can: be
|
|
executed whether the primary command buffer has a pipeline statistics
|
|
query active that includes this bit or not.
|
|
If this value excludes a given bit, then the active pipeline statistics
|
|
query must: not be from a query pool that counts that statistic.
|
|
|
|
.Valid Usage
|
|
****
|
|
* If the <<features-features-inheritedQueries,inherited queries>> feature
|
|
is not enabled, pname:occlusionQueryEnable must: be ename:VK_FALSE
|
|
* If the <<features-features-inheritedQueries,inherited queries>> feature
|
|
is enabled, pname:queryFlags must: be a valid combination of
|
|
elink:VkQueryControlFlagBits values
|
|
* If the <<features-features-pipelineStatisticsQuery,pipeline statistics
|
|
queries>> feature is not enabled, pname:pipelineStatistics must: be
|
|
code:0
|
|
****
|
|
|
|
include::../validity/structs/VkCommandBufferInheritanceInfo.txt[]
|
|
|
|
A primary command buffer is considered to be pending execution from the time
|
|
it is submitted via fname:vkQueueSubmit until that submission completes.
|
|
|
|
A secondary command buffer is considered to be pending execution from the
|
|
time its execution is recorded into a primary buffer (via
|
|
fname:vkCmdExecuteCommands) until the final time that primary buffer's
|
|
submission to a queue completes.
|
|
If, after the primary buffer completes, the secondary command buffer is
|
|
recorded to execute on a different primary buffer, the first primary buffer
|
|
must: not be resubmitted until after it is reset with
|
|
flink:vkResetCommandBuffer unless the secondary command buffer was recorded
|
|
with ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT.
|
|
|
|
If ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT is not set on a
|
|
secondary command buffer, that command buffer must: not be used more than
|
|
once in a given primary command buffer.
|
|
Furthermore, if a secondary command buffer without
|
|
ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set is recorded to
|
|
execute in a primary command buffer with
|
|
ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set, the primary command
|
|
buffer must: not be pending execution more than once at a time.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
On some implementations, not using the
|
|
ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT bit enables command
|
|
buffers to be patched in-place if needed, rather than creating a copy of the
|
|
command buffer.
|
|
====
|
|
|
|
If a command buffer is in the executable state and the command buffer was
|
|
allocated from a command pool with the
|
|
ename:VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, then
|
|
fname:vkBeginCommandBuffer implicitly resets the command buffer, behaving as
|
|
if fname:vkResetCommandBuffer had been called with
|
|
ename:VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT not set.
|
|
It then puts the command buffer in the recording state.
|
|
|
|
Once recording starts, an application records a sequence of commands
|
|
(ftext:vkCmd*) to set state in the command buffer, draw, dispatch, and other
|
|
commands.
|
|
|
|
ifdef::VK_NVX_device_generated_commands[]
|
|
Several commands can also be recorded indirectly from sname:VkBuffer
|
|
content, see <<device-generated-commands>>.
|
|
endif::VK_NVX_device_generated_commands[]
|
|
|
|
// refBegin vkEndCommandBuffer Finish recording a command buffer
|
|
|
|
To complete recording of a command buffer, call:
|
|
|
|
include::../api/protos/vkEndCommandBuffer.txt[]
|
|
|
|
* pname:commandBuffer is the command buffer to complete recording.
|
|
The command buffer must: have been in the recording state, and is moved
|
|
to the executable state.
|
|
|
|
If there was an error during recording, the application will be notified by
|
|
an unsuccessful return code returned by fname:vkEndCommandBuffer.
|
|
If the application wishes to further use the command buffer, the command
|
|
buffer must: be reset.
|
|
|
|
.Valid Usage
|
|
****
|
|
* pname:commandBuffer must: be in the recording state
|
|
* If pname:commandBuffer is a primary command buffer, there must: not be
|
|
an active render pass instance
|
|
* All queries made <<queries-operation-active,active>> during the
|
|
recording of pname:commandBuffer must: have been made inactive
|
|
****
|
|
|
|
include::../validity/protos/vkEndCommandBuffer.txt[]
|
|
|
|
When a command buffer is in the executable state, it can: be submitted to a
|
|
queue for execution.
|
|
|
|
|
|
[[commandbuffers-submission]]
|
|
== Command Buffer Submission
|
|
|
|
// refBegin vkQueueSubmit Submits a sequence of semaphores or command buffers to a queue
|
|
|
|
To submit command buffers to a queue, call:
|
|
|
|
include::../api/protos/vkQueueSubmit.txt[]
|
|
|
|
* pname:queue is the queue that the command buffers will be submitted to.
|
|
* pname:submitCount is the number of elements in the pname:pSubmits array.
|
|
* pname:pSubmits is a pointer to an array of slink:VkSubmitInfo
|
|
structures, each specifying a command buffer submission batch.
|
|
* pname:fence is an optional handle to a fence to be signaled.
|
|
If pname:fence is not dlink:VK_NULL_HANDLE, it defines a
|
|
<<synchronization-fences-signaling, fence signal operation>>.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
Submission can be a high overhead operation, and applications should:
|
|
attempt to batch work together into as few calls to fname:vkQueueSubmit as
|
|
possible.
|
|
====
|
|
|
|
fname:vkQueueSubmit is a <<devsandqueues-submission,queue submission
|
|
command>>, with each batch defined by an element of pname:pSubmits as an
|
|
instance of the slink:VkSubmitInfo structure.
|
|
Batches begin execution in the order they appear in pname:pSubmits, but may:
|
|
complete out of order.
|
|
|
|
Fence and semaphore operations submitted with flink:vkQueueSubmit have
|
|
additional ordering constraints compared to other submission commands, with
|
|
dependencies involving previous and subsequent queue operations.
|
|
Information about these additional constraints can be found in the
|
|
<<synchronization-semaphores, semaphore>> and <<synchronization-fences,
|
|
fence>> sections of <<synchronization, the synchronization chapter>>.
|
|
|
|
Details on the interaction of pname:pWaitDstStageMask with synchronization
|
|
are described in the <<synchronization-semaphores-waiting, semaphore wait
|
|
operation>> section of <<synchronization, the synchronization chapter>>.
|
|
|
|
The order that batches appear in pname:pSubmits is used to determine
|
|
<<synchronization-submission-order, submission order>>, and thus all the
|
|
<<synchronization-implicit, implicit ordering guarantees>> that respect it.
|
|
Other than these implicit ordering guarantees and any <<synchronization,
|
|
explicit synchronization primitives>>, these batches may: overlap or
|
|
otherwise execute out of order.
|
|
|
|
.Valid Usage
|
|
****
|
|
* If pname:fence is not dlink:VK_NULL_HANDLE, pname:fence must: be
|
|
unsignaled
|
|
* If pname:fence is not dlink:VK_NULL_HANDLE, pname:fence must: not be
|
|
associated with any other queue command that has not yet completed
|
|
execution on that queue
|
|
* Any calls to flink:vkCmdSetEvent, flink:vkCmdResetEvent or
|
|
flink:vkCmdWaitEvents that have been recorded into any of the command
|
|
buffer elements of the pname:pCommandBuffers member of any element of
|
|
pname:pSubmits, must: not reference any slink:VkEvent that is referenced
|
|
by any of those commands that is pending execution on another queue.
|
|
* Any stage flag included in any element of the pname:pWaitDstStageMask
|
|
member of any element of pname:pSubmits must: be a pipeline stage
|
|
supported by one of the capabilities of pname:queue, as specified in the
|
|
<<synchronization-pipeline-stages-supported, table of supported pipeline
|
|
stages>>.
|
|
* Any given element of the pname:pSignalSemaphores member of any element
|
|
of pname:pSubmits must: be unsignaled when the semaphore signal
|
|
operation it defines is executed on the device
|
|
* When a semaphore unsignal operation defined by any element of the
|
|
pname:pWaitSemaphores member of any element of pname:pSubmits executes
|
|
on pname:queue, no other queue must: be waiting on the same semaphore.
|
|
* All elements of the pname:pWaitSemaphores member of all elements of
|
|
pname:pSubmits must: be semaphores that are signaled, or have
|
|
<<synchronization-semaphores-signaling, semaphore signal operations>>
|
|
previously submitted for execution.
|
|
****
|
|
|
|
include::../validity/protos/vkQueueSubmit.txt[]
|
|
|
|
// refBegin VkSubmitInfo Structure specifying a queue submit operation
|
|
|
|
The sname:VkSubmitInfo structure is defined as:
|
|
|
|
include::../api/structs/VkSubmitInfo.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:waitSemaphoreCount is the number of semaphores upon which to wait
|
|
before executing the command buffers for the batch.
|
|
* pname:pWaitSemaphores is a pointer to an array of semaphores upon which
|
|
to wait before the command buffers for this batch begin execution.
|
|
If semaphores to wait on are provided, they define a
|
|
<<synchronization-semaphores-waiting, semaphore wait operation>>.
|
|
* pname:pWaitDstStageMask is a pointer to an array of pipeline stages at
|
|
which each corresponding semaphore wait will occur.
|
|
* pname:commandBufferCount is the number of command buffers to execute in
|
|
the batch.
|
|
* pname:pCommandBuffers is a pointer to an array of command buffers to
|
|
execute in the batch.
|
|
* pname:signalSemaphoreCount is the number of semaphores to be signaled
|
|
once the commands specified in pname:pCommandBuffers have completed
|
|
execution.
|
|
* pname:pSignalSemaphores is a pointer to an array of semaphores which
|
|
will be signaled when the command buffers for this batch have completed
|
|
execution.
|
|
If semaphores to be signaled are provided, they define a
|
|
<<synchronization-semaphores-signaling, semaphore signal operation>>.
|
|
|
|
The order that command buffers appear in pname:pCommandBuffers is used to
|
|
determine <<synchronization-submission-order, submission order>>, and thus
|
|
all the <<synchronization-implicit, implicit ordering guarantees>> that
|
|
respect it.
|
|
Other than these implicit ordering guarantees and any <<synchronization,
|
|
explicit synchronization primitives>>, these command buffers may: overlap or
|
|
otherwise execute out of order.
|
|
|
|
|
|
.Valid Usage
|
|
****
|
|
* Any given element of pname:pCommandBuffers must: either have been
|
|
recorded with the ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, or
|
|
not currently be executing on the device
|
|
* Any given element of pname:pCommandBuffers must: be in the executable
|
|
state
|
|
* If any given element of pname:pCommandBuffers contains commands that
|
|
execute secondary command buffers, those secondary command buffers must:
|
|
have been recorded with the
|
|
ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, or not currently be
|
|
executing on the device
|
|
* If any given element of pname:pCommandBuffers was recorded with
|
|
ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, it must: not have
|
|
been previously submitted without re-recording that command buffer
|
|
* If any given element of pname:pCommandBuffers contains commands that
|
|
execute secondary command buffers recorded with
|
|
ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, each such secondary
|
|
command buffer must: not have been previously submitted without
|
|
re-recording that command buffer
|
|
* Any given element of pname:pCommandBuffers must: not contain commands
|
|
that execute a secondary command buffer, if that secondary command
|
|
buffer has been recorded in another primary command buffer after it was
|
|
recorded into this sname:VkCommandBuffer
|
|
* Any given element of pname:pCommandBuffers must: have been allocated
|
|
from a sname:VkCommandPool that was created for the same queue family
|
|
that the calling command's pname:queue belongs to
|
|
* Any given element of pname:pCommandBuffers must: not have been allocated
|
|
with ename:VK_COMMAND_BUFFER_LEVEL_SECONDARY
|
|
* If the <<features-features-geometryShader,geometry shaders>> feature is
|
|
not enabled, any given element of pname:pWaitDstStageMask must: not
|
|
contain ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
|
|
* If the <<features-features-tessellationShader,tessellation shaders>>
|
|
feature is not enabled, any given element of pname:pWaitDstStageMask
|
|
must: not contain
|
|
ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or
|
|
ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
|
|
* Any given element of pname:pWaitDstStageMask must: not include
|
|
ename:VK_PIPELINE_STAGE_HOST_BIT.
|
|
****
|
|
|
|
include::../validity/structs/VkSubmitInfo.txt[]
|
|
|
|
ifdef::VK_NV_win32_keyed_mutex[]
|
|
include::VK_NV_win32_keyed_mutex/keyed_mutex_submit.txt[]
|
|
endif::VK_NV_win32_keyed_mutex[]
|
|
|
|
|
|
[[commandbuffers-submission-progress]]
|
|
== Queue Forward Progress
|
|
|
|
The application must: ensure that command buffer submissions will be able to
|
|
complete without any subsequent operations by the application on any queue.
|
|
After any call to fname:vkQueueSubmit, for every queued wait on a semaphore
|
|
there must: be a prior signal of that semaphore that will not be consumed by
|
|
a different wait on the semaphore.
|
|
|
|
Command buffers in the submission can: include flink:vkCmdWaitEvents
|
|
commands that wait on events that will not be signaled by earlier commands
|
|
in the queue.
|
|
Such events must: be signaled by the application using flink:vkSetEvent, and
|
|
the fname:vkCmdWaitEvents commands that wait upon them must: not be inside a
|
|
render pass instance.
|
|
Implementations may: have limits on how long the command buffer will wait,
|
|
in order to avoid interfering with progress of other clients of the device.
|
|
If the event is not signaled within these limits, results are undefined and
|
|
may: include device loss.
|
|
|
|
|
|
[[commandbuffers-secondary]]
|
|
== Secondary Command Buffer Execution
|
|
|
|
// refBegin vkCmdExecuteCommands Execute a secondary command buffer from a primary command buffer
|
|
|
|
A secondary command buffer must: not be directly submitted to a queue.
|
|
Instead, secondary command buffers are recorded to execute as part of a
|
|
primary command buffer with the command:
|
|
|
|
include::../api/protos/vkCmdExecuteCommands.txt[]
|
|
|
|
* pname:commandBuffer is a handle to a primary command buffer that the
|
|
secondary command buffers are executed in.
|
|
* pname:commandBufferCount is the length of the pname:pCommandBuffers
|
|
array.
|
|
* pname:pCommandBuffers is an array of secondary command buffer handles,
|
|
which are recorded to execute in the primary command buffer in the order
|
|
they are listed in the array.
|
|
|
|
Once fname:vkCmdExecuteCommands has been called, any prior executions of the
|
|
secondary command buffers specified by pname:pCommandBuffers in any other
|
|
primary command buffer become invalidated, unless those secondary command
|
|
buffers were recorded with
|
|
ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT.
|
|
|
|
.Valid Usage
|
|
****
|
|
* pname:commandBuffer must: have been allocated with a pname:level of
|
|
ename:VK_COMMAND_BUFFER_LEVEL_PRIMARY
|
|
* Any given element of pname:pCommandBuffers must: have been allocated
|
|
with a pname:level of ename:VK_COMMAND_BUFFER_LEVEL_SECONDARY
|
|
* Any given element of pname:pCommandBuffers must: not be already pending
|
|
execution in pname:commandBuffer, or appear twice in
|
|
pname:pCommandBuffers, unless it was recorded with the
|
|
ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag
|
|
* Any given element of pname:pCommandBuffers must: not be already pending
|
|
execution in any other sname:VkCommandBuffer, unless it was recorded
|
|
with the ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag
|
|
* Any given element of pname:pCommandBuffers must: be in the executable
|
|
state
|
|
* Any given element of pname:pCommandBuffers must: have been allocated
|
|
from a sname:VkCommandPool that was created for the same queue family as
|
|
the sname:VkCommandPool from which pname:commandBuffer was allocated
|
|
* If fname:vkCmdExecuteCommands is being called within a render pass
|
|
instance, that render pass instance must: have been begun with the
|
|
pname:contents parameter of fname:vkCmdBeginRenderPass set to
|
|
ename:VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS
|
|
* If fname:vkCmdExecuteCommands is being called within a render pass
|
|
instance, any given element of pname:pCommandBuffers must: have been
|
|
recorded with the ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
|
|
* If fname:vkCmdExecuteCommands is being called within a render pass
|
|
instance, any given element of pname:pCommandBuffers must: have been
|
|
recorded with sname:VkCommandBufferInheritanceInfo::pname:subpass set to
|
|
the index of the subpass which the given command buffer will be executed
|
|
in
|
|
* If fname:vkCmdExecuteCommands is being called within a render pass
|
|
instance, the render passes specified in the
|
|
pname::pBeginInfo::pname:pInheritanceInfo::pname:renderPass members of
|
|
the flink:vkBeginCommandBuffer commands used to begin recording each
|
|
element of pname:pCommandBuffers must: be
|
|
<<renderpass-compatibility,compatible>> with the current render pass.
|
|
* If fname:vkCmdExecuteCommands is being called within a render pass
|
|
instance, and any given element of pname:pCommandBuffers was recorded
|
|
with sname:VkCommandBufferInheritanceInfo::pname:framebuffer not equal
|
|
to dlink:VK_NULL_HANDLE, that sname:VkFramebuffer must: match the
|
|
sname:VkFramebuffer used in the current render pass instance
|
|
* If fname:vkCmdExecuteCommands is not being called within a render pass
|
|
instance, any given element of pname:pCommandBuffers must: not have been
|
|
recorded with the ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
|
|
* If the <<features-features-inheritedQueries,inherited queries>> feature
|
|
is not enabled, pname:commandBuffer must: not have any queries
|
|
<<queries-operation-active,active>>
|
|
* If pname:commandBuffer has a ename:VK_QUERY_TYPE_OCCLUSION query
|
|
<<queries-operation-active,active>>, then each element of
|
|
pname:pCommandBuffers must: have been recorded with
|
|
sname:VkCommandBufferInheritanceInfo::pname:occlusionQueryEnable set to
|
|
ename:VK_TRUE
|
|
* If pname:commandBuffer has a ename:VK_QUERY_TYPE_OCCLUSION query
|
|
<<queries-operation-active,active>>, then each element of
|
|
pname:pCommandBuffers must: have been recorded with
|
|
sname:VkCommandBufferInheritanceInfo::pname:queryFlags having all bits
|
|
set that are set for the query
|
|
* If pname:commandBuffer has a ename:VK_QUERY_TYPE_PIPELINE_STATISTICS
|
|
query <<queries-operation-active,active>>, then each element of
|
|
pname:pCommandBuffers must: have been recorded with
|
|
sname:VkCommandBufferInheritanceInfo::pname:pipelineStatistics having
|
|
all bits set that are set in the sname:VkQueryPool the query uses
|
|
* Any given element of pname:pCommandBuffers must: not begin any query
|
|
types that are <<queries-operation-active,active>> in
|
|
pname:commandBuffer
|
|
****
|
|
|
|
include::../validity/protos/vkCmdExecuteCommands.txt[]
|