Function Prototype

vkGetQueryPoolResults

Copy results of queries in a query pool to a host memory region

To retrieve status and results for a set of queries, call:

VkResult vkGetQueryPoolResults(
    VkDevice device,
    VkQueryPool queryPool,
    uint32_t firstQuery,
    uint32_t queryCount,
    size_t dataSize,
    void* pData,
    VkDeviceSize stride,
    VkQueryResultFlags flags);
  • device is the logical device that owns the query pool.
  • queryPool is the query pool managing the queries containing the desired results.
  • firstQuery is the initial query index.
  • queryCount is the number of queries to read.
  • dataSize is the size in bytes of the buffer pointed to by pData.
  • pData is a pointer to an application-allocated buffer where the results will be written
  • stride is the stride in bytes between results for individual queries within pData.
  • flags is a bitmask of VkQueryResultFlagBits specifying how and when results are returned.

Any results written for a query are written according to a layout dependent on the query type.

If no bits are set in flags, and all requested queries are in the available state, results are written as an array of 32-bit unsigned integer values. Behavior when not all queries are available is described below.

If VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is set, results for all queries in queryPool identified by firstQuery and queryCount are copied to pData, along with an extra availability or status value written directly after the results of each query and interpreted as an unsigned integer. A value of zero indicates that the results are not yet available, otherwise the query is complete and results are available. The size of the availability or status values is 64 bits if VK_QUERY_RESULT_64_BIT is set in flags. Otherwise, it is 32 bits.

If VK_QUERY_RESULT_WITH_STATUS_BIT_KHR is set, results for all queries in queryPool identified by firstQuery and queryCount are copied to pData, along with an extra status value written directly after the results of each query and interpreted as a signed integer. A value of zero indicates that the results are not yet available. Positive values indicate that the operations within the query completed successfully, and the query results are valid. Negative values indicate that the operations within the query completed unsuccessfully.

VkQueryResultStatusKHR defines specific meaning for values returned here, though implementations are free to return other values.

If the status value written is negative, indicating that the operations within the query completed unsuccessfully, then all other results written by this command are undefined: unless otherwise specified for any of the results of the used query type.

If VK_QUERY_RESULT_WITH_AVAILABILITY_BIT or VK_QUERY_RESULT_WITH_STATUS_BIT_KHR is set, the layout of data in the buffer is a (result,availability) or (result,status) pair for each query returned, and stride is the stride between each pair.

Results for any available query written by this command are final and represent the final result of the query. If VK_QUERY_RESULT_PARTIAL_BIT is set, then for any query that is unavailable, an intermediate result between zero and the final result value is written for that query. Otherwise, any result written by this command is undefined:.

If VK_QUERY_RESULT_64_BIT is set, results and, if returned, availability or status values for all queries are written as an array of 64-bit values. If the queryPool was created with VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, results for each query are written as an array of the type indicated by VkPerformanceCounterKHR::storage for the counter being queried. Otherwise, results and availability or status values are written as an array of 32-bit values. If an unsigned integer query’s value overflows the result type, the value may either wrap or saturate. If the maintenance7 feature is enabled, for an unsigned integer query, the 32-bit result value must be equal to the 32 least significant bits of the equivalent 64-bit result value. If a signed integer query’s value overflows the result type, the value is undefined:. If a floating-point query’s value is not representable as the result type, the value is undefined:.

If VK_QUERY_RESULT_WAIT_BIT is set, this command defines an execution dependency with any earlier commands that writes one of the identified queries. The first synchronization scope includes all instances of vkCmdEndQuery, vkCmdEndQueryIndexedEXT, vkCmdWriteTimestamp2, and vkCmdWriteTimestamp that reference any query in queryPool indicated by firstQuery and queryCount. The second synchronization scope includes the host operations of this command.

If VK_QUERY_RESULT_WAIT_BIT is not set, vkGetQueryPoolResultsmay return VK_NOT_READY if there are queries in the unavailable state.

Applications must take care to ensure that use of the VK_QUERY_RESULT_WAIT_BIT bit has the desired effect.

For example, if a query has been used previously and a command buffer records the commands vkCmdResetQueryPool, vkCmdBeginQuery, and vkCmdEndQuery for that query, then the query will remain in the available state until vkResetQueryPool is called or the vkCmdResetQueryPool command executes on a queue. Applications can use fences or events to ensure that a query has already been reset before checking for its results or availability status. Otherwise, a stale value could be returned from a previous use of the query.

The above also applies when VK_QUERY_RESULT_WAIT_BIT is used in combination with VK_QUERY_RESULT_WITH_AVAILABILITY_BIT. In this case, the returned availability status may reflect the result of a previous use of the query unless vkResetQueryPool is called or the vkCmdResetQueryPool command has been executed since the last use of the query.

A similar situation can arise with the VK_QUERY_RESULT_WITH_STATUS_BIT_KHR flag.

Applications can double-buffer query pool usage, with a pool per frame, and reset queries at the end of the frame in which they are read.

Valid Usage

VUID-vkGetQueryPoolResults-firstQuery-09436

firstQuery must be less than the number of queries in queryPool

VUID-vkGetQueryPoolResults-firstQuery-09437

The sum of firstQuery and queryCount must be less than or equal to the number of queries in queryPool

VUID-vkGetQueryPoolResults-queryCount-09438

If queryCount is greater than 1, stride must not be zero

VUID-vkGetQueryPoolResults-queryType-09439

If the queryType used to create queryPool was VK_QUERY_TYPE_TIMESTAMP, flags must not contain VK_QUERY_RESULT_PARTIAL_BIT

VUID-vkGetQueryPoolResults-queryType-09440

If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, flags must not contain VK_QUERY_RESULT_WITH_AVAILABILITY_BIT, VK_QUERY_RESULT_WITH_STATUS_BIT_KHR, VK_QUERY_RESULT_PARTIAL_BIT, or VK_QUERY_RESULT_64_BIT

VUID-vkGetQueryPoolResults-queryType-09441

If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the queryPool must have been recorded once for each pass as retrieved via a call to vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR

VUID-vkGetQueryPoolResults-queryType-09442

If the queryType used to create queryPool was VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR, then flags must include VK_QUERY_RESULT_WITH_STATUS_BIT_KHR

VUID-vkGetQueryPoolResults-flags-09443

If flags includes VK_QUERY_RESULT_WITH_STATUS_BIT_KHR, then it must not include VK_QUERY_RESULT_WITH_AVAILABILITY_BIT

VUID-vkGetQueryPoolResults-None-09401

All queries used by the command must not be uninitialized

VUID-vkGetQueryPoolResults-flags-02828

If VK_QUERY_RESULT_64_BIT is not set in flags and the queryType used to create queryPool was not VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, then pData and stride must be multiples of 4

VUID-vkGetQueryPoolResults-flags-00815

If VK_QUERY_RESULT_64_BIT is set in flags then pData and stride must be multiples of 8

VUID-vkGetQueryPoolResults-stride-08993

If `VK_QUERY_RESULT_WITH_AVAILABILITY_BIT` is set, `stride`
:normative{type="must"} be large enough to contain the unsigned integer representing
availability

or status in addition to the query result

VUID-vkGetQueryPoolResults-queryType-03229

If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, then pData and stride must be multiples of the size of VkPerformanceCounterResultKHR

VUID-vkGetQueryPoolResults-queryType-04519

If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, then stride must be large enough to contain the VkQueryPoolPerformanceCreateInfoKHR::counterIndexCount used to create queryPool times the size of VkPerformanceCounterResultKHR

VUID-vkGetQueryPoolResults-dataSize-00817

dataSize must be large enough to contain the result of each query, as described here

Valid Usage (Implicit)

VUID-vkGetQueryPoolResults-pData-parameter

pData must be a valid pointer to an array of dataSize bytes

VUID-vkGetQueryPoolResults-flags-parameter

flags must be a valid combination of VkQueryResultFlagBits values

VUID-vkGetQueryPoolResults-queryPool-parent

queryPool must have been created, allocated, or retrieved from device