vkCmdWriteTimestamp
To request a timestamp and write the value to memory, call:
void vkCmdWriteTimestamp(
VkCommandBuffer commandBuffer,
VkPipelineStageFlagBits pipelineStage,
VkQueryPool queryPool,
uint32_t query);
commandBuffer
is the command buffer into which the command will be recorded.pipelineStage
is a VkPipelineStageFlagBits value, specifying a stage of the pipeline.queryPool
is the query pool that will manage the timestamp.query
is the query within the query pool that will contain the timestamp.
When vkCmdWriteTimestamp
is submitted to a queue, it defines an
execution dependency on commands that were submitted before it, and writes a
timestamp to a query pool.
The first synchronization scope
includes all commands that occur earlier in
submission order.
The synchronization scope is limited to operations on the pipeline stage
specified by pipelineStage
.
The second synchronization scope includes only the timestamp write operation.
Implementations may write the timestamp at any stage that is
logically later than stage
.
Any timestamp write that happens-after another timestamp write in the same submission must not
have a lower value unless its value overflows the maximum supported integer
bit width of the query.
If
VK_KHR_calibrated_timestamps
or
VK_EXT_calibrated_timestamps
is enabled, this extends to timestamp writes across all submissions on the
same logical device: any timestamp write that
happens-after another must not
have a lower value unless its value overflows the maximum supported integer
bit width of the query.
Timestamps written by this command must be in the
VK_TIME_DOMAIN_DEVICE_KHR
time domain. If an overflow occurs, the timestamp value must wrap back to zero.
Comparisons between timestamps should be done between timestamps where they are guaranteed to not decrease. For example, subtracting an older timestamp from a newer one to determine the execution time of a sequence of commands is only a reliable measurement if the two timestamp writes were performed in the same submission, or if the writes were performed on the same logical device and VK_KHR_calibrated_timestamps or VK_EXT_calibrated_timestamps is enabled.
If vkCmdWriteTimestamp
is called while executing a render pass
instance that has multiview enabled, the timestamp uses N consecutive
query indices in the query pool (starting at query
) where N is
the number of bits set in the view mask of the subpass the command is
executed in.
The resulting query values are determined by an implementation-dependent
choice of one of the following behaviors:
- The first query is a timestamp value and (if more than one bit is set in the view mask) zero is written to the remaining queries. If two timestamps are written in the same subpass, the sum of the execution time of all views between those commands is the difference between the first query written by each command.
- All N queries are timestamp values. If two timestamps are written in the same subpass, the sum of the execution time of all views between those commands is the sum of the difference between corresponding queries written by each command. The difference between corresponding queries may be the execution time of a single view.
In either case, the application can sum the differences between all N queries to determine the total execution time.
Valid Usage
VUID-vkCmdWriteTimestamp-pipelineStage-04074
pipelineStage
must be a
valid stage for the queue
family that was used to create the command pool that commandBuffer
was allocated from
VUID-vkCmdWriteTimestamp-pipelineStage-04075
If the geometryShader
feature is not
enabled, pipelineStage
must not be
VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
VUID-vkCmdWriteTimestamp-pipelineStage-04076
If the tessellationShader
feature
is not enabled, pipelineStage
must not be
VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
or
VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
VUID-vkCmdWriteTimestamp-pipelineStage-04077
If the conditionalRendering
feature is not enabled, pipelineStage
must not be
VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT
VUID-vkCmdWriteTimestamp-pipelineStage-04078
If the fragmentDensityMap
feature
is not enabled, pipelineStage
must not be
VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT
VUID-vkCmdWriteTimestamp-pipelineStage-04079
If the transformFeedback
feature
is not enabled, pipelineStage
must not be
VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
VUID-vkCmdWriteTimestamp-pipelineStage-04080
If the meshShader
feature is not enabled,
pipelineStage
must not be
VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT
VUID-vkCmdWriteTimestamp-pipelineStage-07077
If the taskShader
feature is not enabled,
pipelineStage
must not be
VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT
VUID-vkCmdWriteTimestamp-shadingRateImage-07314
If neither the shadingRateImage
or
attachmentFragmentShadingRate
are enabled, pipelineStage
must not be
VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
VUID-vkCmdWriteTimestamp-synchronization2-06489
If the synchronization2
feature is
not enabled, pipelineStage
must not be
VK_PIPELINE_STAGE_NONE
VUID-vkCmdWriteTimestamp-rayTracingPipeline-07943
If neither the VK_NV_ray_tracing extension or
rayTracingPipeline
feature are
enabled, pipelineStage
must not be
VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR
VUID-vkCmdWriteTimestamp-queryPool-01416
queryPool
must have been created with a queryType
of
VK_QUERY_TYPE_TIMESTAMP
VUID-vkCmdWriteTimestamp-timestampValidBits-00829
The command pool’s queue family must support a non-zero
timestampValidBits
VUID-vkCmdWriteTimestamp-query-04904
query
must be less than the number of queries in queryPool
VUID-vkCmdWriteTimestamp-None-00830
All queries used by the command must be unavailable
VUID-vkCmdWriteTimestamp-query-00831
If vkCmdWriteTimestamp
is called within a render pass instance,
the sum of query
and the number of bits set in the current
subpass’s view mask must be less than or equal to the number of queries
in queryPool
Valid Usage (Implicit)
VUID-vkCmdWriteTimestamp-commandBuffer-parameter
commandBuffer
must be a valid VkCommandBuffer handle
VUID-vkCmdWriteTimestamp-pipelineStage-parameter
pipelineStage
must be a valid VkPipelineStageFlagBits value
VUID-vkCmdWriteTimestamp-queryPool-parameter
queryPool
must be a valid VkQueryPool handle
VUID-vkCmdWriteTimestamp-commandBuffer-recording
commandBuffer
must be in the recording state
VUID-vkCmdWriteTimestamp-commandBuffer-cmdpool
The VkCommandPool
that commandBuffer
was allocated from must support transfer, graphics, compute, decode, encode, or optical flow operations
VUID-vkCmdWriteTimestamp-commonparent
Both of commandBuffer
, and queryPool
must have been created, allocated, or retrieved from the same VkDevice
Host Synchronization
- Host access to
commandBuffer
must be externally synchronized - Host access to the
VkCommandPool
thatcommandBuffer
was allocated from must be externally synchronized ::