diff --git a/src/tool/pps/pps_datasource.cc b/src/tool/pps/pps_datasource.cc index 168eda79c54..c397b602936 100644 --- a/src/tool/pps/pps_datasource.cc +++ b/src/tool/pps/pps_datasource.cc @@ -187,6 +187,32 @@ template void add_descriptors(GpuCounterDescript } spec->add_numerator_units(units); spec->set_select_by_default(true); + + // Classify counter into Perfetto counter groups via driver's virtual method. + // Each driver maps its own counter naming conventions; unrecognised counters + // are left without a group (which is valid). + driver.classify_counter_groups(counter.name, [&](CounterGroupType group) { + switch (group) { + case CounterGroupType::VERTICES: + spec->add_groups(GpuCounterDescriptor::VERTICES); + break; + case CounterGroupType::FRAGMENTS: + spec->add_groups(GpuCounterDescriptor::FRAGMENTS); + break; + case CounterGroupType::COMPUTE: + spec->add_groups(GpuCounterDescriptor::COMPUTE); + break; + case CounterGroupType::MEMORY: + spec->add_groups(GpuCounterDescriptor::MEMORY); + break; + case CounterGroupType::PRIMITIVES: + spec->add_groups(GpuCounterDescriptor::PRIMITIVES); + break; + case CounterGroupType::RAY_TRACING: + spec->add_groups(GpuCounterDescriptor::RAY_TRACING); + break; + } + }); } } diff --git a/src/tool/pps/pps_driver.h b/src/tool/pps/pps_driver.h index b46c0f58bf6..c79e34ec4aa 100644 --- a/src/tool/pps/pps_driver.h +++ b/src/tool/pps/pps_driver.h @@ -9,6 +9,7 @@ #pragma once +#include #include #include #include @@ -19,6 +20,18 @@ namespace pps { +/// @brief Perfetto-compatible counter group categories for classifying GPU counters. +/// These mirror the values in perfetto::protos::pbzero::GpuCounterDescriptor::CounterGroup +/// so that driver implementations do not need to include Perfetto headers. +enum class CounterGroupType { + VERTICES, + FRAGMENTS, + COMPUTE, + MEMORY, + PRIMITIVES, + RAY_TRACING, +}; + /// @brief Abstract Driver class class Driver { @@ -90,6 +103,14 @@ class Driver /// than sampling separately CPU & GPU timestamps. virtual bool cpu_gpu_timestamp(uint64_t &cpu_timestamp, uint64_t &gpu_timestamp) const = 0; + /// @brief Classify a counter name into Perfetto counter groups. + /// Drivers should call add_group(CounterGroupType::XYZ) for each group + /// that applies to the given counter name. + /// The default implementation does nothing (counters are left unclassified). + virtual void classify_counter_groups( + const std::string & /*counter_name*/, + const std::function & /*add_group*/) const {} + DrmDevice drm_device; /// List of counter groups