Class INTELPerformanceQuery

java.lang.Object
org.lwjgl.vulkan.INTELPerformanceQuery

public class INTELPerformanceQuery extends Object
This extension allows an application to capture performance data to be interpreted by an external application or library.

Such a library is available at : https://github.com/intel/metrics-discovery

Performance analysis tools such as Graphics Performance Analyzers make use of this extension and the metrics-discovery library to present the data in a human readable way.

Example Code

 // 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.
Name String
VK_INTEL_performance_query
Extension Type
Device extension
Registered Extension Number
211
Revision
2
Special Use
Contact
Other Extension Metadata
Last Modified Date
2018-05-16
IP Status
No known IP claims.
Contributors
  • Lionel Landwerlin, Intel
  • Piotr Maciejewski, Intel