intel/pps: classify OA counters into Perfetto counter groups

Implement Driver::classify_counter_groups() for the Intel PPS driver so
that Perfetto's GpuCounterDescriptor exposes a non-empty 'groups' field
for every Intel OA counter.

The classifier matches Intel OA counter names against well-known
prefixes / suffixes / substrings to assign each counter to one or more
Perfetto buckets:

  VERTICES     starts with VS, VERTEX; contains _VERTEX; ends with _VS
  FRAGMENTS    starts with PS, PIXEL, POSTPS, RASTERIZER, SHADER_PIX,
               SAMPLES; ends with _PS
  COMPUTE      starts with CS, ASYNCCS, ASYNC_GPGPU, GPGPU
  MEMORY       starts with GTI, L3, SLM, SHADERMEMORY, LOAD_STORE,
               COLOR_L3, GPU_MEMORY, SAMPLER_
  PRIMITIVES   starts with CLIPPER, SO, IA_, STREAMOUT, STRIPSFAN;
               contains PRIMITIVE
  RAY_TRACING  starts with RT_; contains RAYTRACE or _RT_

A counter may belong to several buckets at once -- for example
CLIPPER_INPUT_VERTEX is both PRIMITIVES and VERTICES -- which is
allowed by the repeated GpuCounterSpec.groups field.

This fixes the Android CTS test
  CtsGpuProfilingDataTest#testProfilingDataProducersAvailable
which previously failed on Intel platforms with:
  Required counter groups missing.
  Found:    []
  Required: [COMPUTE, FRAGMENTS, MEMORY, PRIMITIVES, VERTICES, RAY_TRACING]

Signed-off-by: Nemallapudi, Jaikrishna <nemallapudi.jaikrishna@intel.com>
This commit is contained in:
Nemallapudi, Jaikrishna 2026-05-07 09:35:31 +00:00 committed by Jaikrishna Nemallapudi
parent 51d96c9f75
commit 3ecdfda2b1
2 changed files with 61 additions and 0 deletions

View file

@ -8,6 +8,8 @@
#include "intel_pps_driver.h"
#include <cctype>
#include <cstring>
#include <dirent.h>
#include <fcntl.h>
#include <math.h>
@ -384,4 +386,59 @@ bool IntelDriver::cpu_gpu_timestamp(uint64_t &cpu_timestamp,
return true;
}
void IntelDriver::classify_counter_groups(
const std::string &cname_in,
const std::function<void(CounterGroupType)> &add_group) const
{
// Normalise to upper-case so the heuristics work for both Mixed-case
// (e.g. "VsThreads", "PostPsDepthTestFails") and UPPER_SNAKE_CASE
// (e.g. "CLIPPER_INPUT_VERTEX") counter names used across Intel OA XMLs.
std::string cname;
cname.reserve(cname_in.size());
for (char c : cname_in)
cname.push_back(static_cast<char>(std::toupper(static_cast<unsigned char>(c))));
auto starts_with = [](const std::string &s, const char *prefix) {
return s.compare(0, strlen(prefix), prefix) == 0;
};
auto ends_with = [](const std::string &s, const char *suffix) {
size_t slen = strlen(suffix);
return s.size() >= slen && s.compare(s.size() - slen, slen, suffix) == 0;
};
auto contains = [](const std::string &s, const char *needle) {
return s.find(needle) != std::string::npos;
};
if (starts_with(cname, "VS") || starts_with(cname, "VERTEX") ||
contains(cname, "_VERTEX") || ends_with(cname, "_VS")) {
add_group(CounterGroupType::VERTICES);
}
if (starts_with(cname, "PS") || starts_with(cname, "PIXEL") ||
starts_with(cname, "POSTPS") || starts_with(cname, "RASTERIZER") ||
starts_with(cname, "SHADERPIX") || starts_with(cname, "SHADER_PIX") ||
starts_with(cname, "SAMPLES") || ends_with(cname, "_PS")) {
add_group(CounterGroupType::FRAGMENTS);
}
if (starts_with(cname, "CS") || starts_with(cname, "ASYNCCS") ||
starts_with(cname, "ASYNC_GPGPU") || starts_with(cname, "GPGPU")) {
add_group(CounterGroupType::COMPUTE);
}
if (starts_with(cname, "GTI") || starts_with(cname, "L3") ||
starts_with(cname, "SLM") || starts_with(cname, "SHADERMEMORY") ||
starts_with(cname, "LOAD_STORE") || starts_with(cname, "LOADSTORE") ||
starts_with(cname, "COLOR_L3") || starts_with(cname, "GPU_MEMORY") ||
starts_with(cname, "SAMPLER_")) {
add_group(CounterGroupType::MEMORY);
}
if (starts_with(cname, "CLIPPER") || starts_with(cname, "SO") ||
starts_with(cname, "IA_") || starts_with(cname, "STREAMOUT") ||
starts_with(cname, "STRIPSFAN") || contains(cname, "PRIMITIVE")) {
add_group(CounterGroupType::PRIMITIVES);
}
if (starts_with(cname, "RT_") || contains(cname, "RAYTRACE") ||
contains(cname, "_RT_")) {
add_group(CounterGroupType::RAY_TRACING);
}
}
} // namespace pps

View file

@ -52,6 +52,10 @@ class IntelDriver : public Driver
bool cpu_gpu_timestamp(uint64_t &cpu_timestamp,
uint64_t &gpu_timestamp) const override;
void classify_counter_groups(
const std::string &counter_name,
const std::function<void(CounterGroupType)> &add_group) const override;
private:
/// @brief Requests the next perf sample
/// @return The sample GPU timestamp