mirror of
https://github.com/status-im/Vulkan-Docs.git
synced 2025-02-25 20:45:12 +00:00
213 lines
5.0 KiB
Plaintext
213 lines
5.0 KiB
Plaintext
|
include::meta/VK_INTEL_performance_query.txt[]
|
||
|
|
||
|
*Last Modified Date*::
|
||
|
2018-05-16
|
||
|
*IP Status*::
|
||
|
No known IP claims.
|
||
|
*Contributors*::
|
||
|
- Lionel Landwerlin, Intel
|
||
|
- Piotr Maciejewski, Intel
|
||
|
|
||
|
This extension allows an application to capture performance data to be
|
||
|
interpreted by a external application or library.
|
||
|
|
||
|
Such a library is available at : https://github.com/intel/metrics-discovery
|
||
|
|
||
|
Performance analysis tools such as GPA
|
||
|
(https://software.intel.com/en-us/gpa) make use of this extension and the
|
||
|
metrics-discovery library to present the data in a human readable way.
|
||
|
|
||
|
=== New Object Types
|
||
|
|
||
|
* slink:VkPerformanceConfigurationINTEL
|
||
|
|
||
|
=== New Enum Constants
|
||
|
|
||
|
* Extending elink:VkStructureType:
|
||
|
** ename:VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL
|
||
|
** ename:VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL
|
||
|
** ename:VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL
|
||
|
** ename:VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL
|
||
|
** ename:VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL
|
||
|
** ename:VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL
|
||
|
|
||
|
* Extending elink:VkQueryType:
|
||
|
** ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL
|
||
|
|
||
|
=== New Enums
|
||
|
|
||
|
* elink:VkPerformanceConfigurationTypeINTEL
|
||
|
* elink:VkQueryPoolSamplingModeINTEL
|
||
|
* elink:VkPerformanceOverrideTypeINTEL
|
||
|
* elink:VkPerformanceParameterTypeINTEL
|
||
|
* elink:VkPerformanceValueTypeINTEL
|
||
|
|
||
|
=== New Structures
|
||
|
|
||
|
* slink:VkPerformanceValueINTEL
|
||
|
* slink:VkInitializePerformanceApiInfoINTEL
|
||
|
* slink:VkQueryPoolCreateInfoINTEL
|
||
|
* slink:VkPerformanceMarkerInfoINTEL
|
||
|
* slink:VkPerformanceStreamMarkerInfoINTEL
|
||
|
* slink:VkPerformanceOverrideInfoINTEL
|
||
|
* slink:VkPerformanceConfigurationAcquireInfoINTEL
|
||
|
|
||
|
=== New Functions
|
||
|
|
||
|
* flink:vkInitializePerformanceApiINTEL
|
||
|
* flink:vkUninitializePerformanceApiINTEL
|
||
|
* flink:vkCmdSetPerformanceMarkerINTEL
|
||
|
* flink:vkCmdSetPerformanceOverrideINTEL
|
||
|
* flink:vkCmdSetPerformanceStreamMarkerINTEL
|
||
|
* flink:vkAcquirePerformanceConfigurationINTEL
|
||
|
* flink:vkReleasePerformanceConfigurationINTEL
|
||
|
* flink:vkQueueSetPerformanceConfigurationINTEL
|
||
|
* flink:vkGetPerformanceParameterINTEL
|
||
|
|
||
|
=== Issues
|
||
|
|
||
|
None.
|
||
|
|
||
|
=== Example Code
|
||
|
|
||
|
[source,c]
|
||
|
---------------------------------------------------
|
||
|
|
||
|
// A previously created device
|
||
|
VkDevice device;
|
||
|
|
||
|
// A queue from from device
|
||
|
VkQueue queue;
|
||
|
|
||
|
VkInitializePerformanceApiInfoINTEL performanceApiInfoIntel = {
|
||
|
VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL,
|
||
|
NULL,
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
vkInitializePerformanceApiINTEL(
|
||
|
device,
|
||
|
&performanceApiInfoIntel);
|
||
|
|
||
|
VkQueryPoolCreateInfoINTEL queryPoolIntel = {
|
||
|
VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL,
|
||
|
NULL,
|
||
|
VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL,
|
||
|
};
|
||
|
|
||
|
VkQueryPoolCreateInfo queryPoolCreateInfo = {
|
||
|
VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
|
||
|
&queryPoolIntel,
|
||
|
0,
|
||
|
VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL,
|
||
|
1,
|
||
|
0
|
||
|
};
|
||
|
|
||
|
VkQueryPool queryPool;
|
||
|
|
||
|
VkResult result = vkCreateQueryPool(
|
||
|
device,
|
||
|
&queryPoolCreateInfo,
|
||
|
NULL,
|
||
|
&queryPool);
|
||
|
|
||
|
assert(VK_SUCCESS == result);
|
||
|
|
||
|
// A command buffer we want to record counters on
|
||
|
VkCommandBuffer commandBuffer;
|
||
|
|
||
|
VkCommandBufferBeginInfo commandBufferBeginInfo = {
|
||
|
VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
|
||
|
NULL,
|
||
|
VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
result = vkBeginCommandBuffer(commandBuffer, &commandBufferBeginInfo);
|
||
|
|
||
|
assert(VK_SUCCESS == result);
|
||
|
|
||
|
vkCmdResetQueryPool(
|
||
|
commandBuffer,
|
||
|
queryPool,
|
||
|
0,
|
||
|
1);
|
||
|
|
||
|
vkCmdBeginQuery(
|
||
|
commandBuffer,
|
||
|
queryPool,
|
||
|
0,
|
||
|
0);
|
||
|
|
||
|
// Perform the commands you want to get performance information on
|
||
|
// ...
|
||
|
|
||
|
// Perform a barrier to ensure all previous commands were complete before
|
||
|
// ending the query
|
||
|
vkCmdPipelineBarrier(commandBuffer,
|
||
|
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
|
||
|
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
|
||
|
0,
|
||
|
0,
|
||
|
NULL,
|
||
|
0,
|
||
|
NULL,
|
||
|
0,
|
||
|
NULL);
|
||
|
|
||
|
vkCmdEndQuery(
|
||
|
commandBuffer,
|
||
|
queryPool,
|
||
|
0);
|
||
|
|
||
|
result = vkEndCommandBuffer(commandBuffer);
|
||
|
|
||
|
assert(VK_SUCCESS == result);
|
||
|
|
||
|
VkPerformanceConfigurationAcquireInfoINTEL performanceConfigurationAcquireInfo = {
|
||
|
VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL,
|
||
|
NULL,
|
||
|
VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL
|
||
|
};
|
||
|
|
||
|
VkPerformanceConfigurationINTEL performanceConfigurationIntel;
|
||
|
|
||
|
result = vkAcquirePerformanceConfigurationINTEL(
|
||
|
device,
|
||
|
&performanceConfigurationAcquireInfo,
|
||
|
&performanceConfigurationIntel);
|
||
|
|
||
|
vkQueueSetPerformanceConfigurationINTEL(queue, performanceConfigurationIntel);
|
||
|
|
||
|
assert(VK_SUCCESS == result);
|
||
|
|
||
|
// Submit the command buffer and wait for its completion
|
||
|
// ...
|
||
|
|
||
|
result = vkReleasePerformanceConfigurationINTEL(
|
||
|
device,
|
||
|
performanceConfigurationIntel);
|
||
|
|
||
|
assert(VK_SUCCESS == result);
|
||
|
|
||
|
// Get the report size from metrics-discovery's QueryReportSize
|
||
|
|
||
|
result = vkGetQueryPoolResults(
|
||
|
device,
|
||
|
queryPool,
|
||
|
0, 1, QueryReportSize,
|
||
|
data, QueryReportSize, 0);
|
||
|
|
||
|
assert(VK_SUCCESS == result);
|
||
|
|
||
|
// The data can then be passed back to metrics-discovery from which
|
||
|
// human readable values can be queried.
|
||
|
|
||
|
---------------------------------------------------
|
||
|
|
||
|
=== Version History
|
||
|
|
||
|
* Revision 1, 2018-05-16 (Lionel Landwerlin)
|
||
|
- Initial revision
|