| // Copyright (c) 2018-2020 Intel Corporation |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| include::{generated}/meta/{refprefix}VK_INTEL_performance_query.txt[] |
| |
| === Other Extension Metadata |
| |
| *Last Modified Date*:: |
| 2018-05-16 |
| *IP Status*:: |
| No known IP claims. |
| *Contributors*:: |
| - Lionel Landwerlin, Intel |
| - Piotr Maciejewski, Intel |
| |
| === Description |
| |
| 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 |
| link:++https://software.intel.com/content/www/us/en/develop/tools/graphics-performance-analyzers.html++[Graphics |
| Performance Analyzers] make use of this extension and the metrics-discovery |
| library to present the data in a human readable way. |
| |
| include::{generated}/interfaces/VK_INTEL_performance_query.txt[] |
| |
| === Example Code |
| |
| [source,c] |
| --------------------------------------------------- |
| |
| // A previously created device |
| VkDevice device; |
| |
| // A queue derived from the device |
| VkQueue queue; |
| |
| VkInitializePerformanceApiInfoINTEL performanceApiInfoIntel = { |
| VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL, |
| NULL, |
| NULL |
| }; |
| |
| vkInitializePerformanceApiINTEL( |
| device, |
| &performanceApiInfoIntel); |
| |
| VkQueryPoolPerformanceQueryCreateInfoINTEL 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 2, 2020-03-06 (Lionel Landwerlin) |
| - Rename VkQueryPoolCreateInfoINTEL in |
| VkQueryPoolPerformanceQueryCreateInfoINTEL |
| |
| * Revision 1, 2018-05-16 (Lionel Landwerlin) |
| - Initial revision |