1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2020 Collabora, Ltd.
3*61046927SAndroid Build Coastguard Worker * Author: Antonio Caggiano <[email protected]>
4*61046927SAndroid Build Coastguard Worker * Author: Rohan Garg <[email protected]>
5*61046927SAndroid Build Coastguard Worker * Author: Robert Beckett <[email protected]>
6*61046927SAndroid Build Coastguard Worker *
7*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
8*61046927SAndroid Build Coastguard Worker */
9*61046927SAndroid Build Coastguard Worker
10*61046927SAndroid Build Coastguard Worker #pragma once
11*61046927SAndroid Build Coastguard Worker
12*61046927SAndroid Build Coastguard Worker #include <cstdint>
13*61046927SAndroid Build Coastguard Worker #include <functional>
14*61046927SAndroid Build Coastguard Worker #include <string>
15*61046927SAndroid Build Coastguard Worker #include <variant>
16*61046927SAndroid Build Coastguard Worker #include <vector>
17*61046927SAndroid Build Coastguard Worker
18*61046927SAndroid Build Coastguard Worker namespace pps
19*61046927SAndroid Build Coastguard Worker {
20*61046927SAndroid Build Coastguard Worker struct CounterGroup {
21*61046927SAndroid Build Coastguard Worker std::string name;
22*61046927SAndroid Build Coastguard Worker
23*61046927SAndroid Build Coastguard Worker uint32_t id;
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker /// List of counters ID belonging to this group
26*61046927SAndroid Build Coastguard Worker std::vector<int32_t> counters;
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker std::vector<CounterGroup> subgroups;
29*61046927SAndroid Build Coastguard Worker };
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker class Driver;
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker class Counter
34*61046927SAndroid Build Coastguard Worker {
35*61046927SAndroid Build Coastguard Worker public:
36*61046927SAndroid Build Coastguard Worker /// @brief A counter value can be of different types depending on what it represents:
37*61046927SAndroid Build Coastguard Worker /// cycles, cycles-per-instruction, percentages, bytes, and so on.
38*61046927SAndroid Build Coastguard Worker enum class Units {
39*61046927SAndroid Build Coastguard Worker Percent,
40*61046927SAndroid Build Coastguard Worker Byte,
41*61046927SAndroid Build Coastguard Worker Hertz,
42*61046927SAndroid Build Coastguard Worker None,
43*61046927SAndroid Build Coastguard Worker };
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Worker using Value = std::variant<int64_t, double>;
46*61046927SAndroid Build Coastguard Worker
47*61046927SAndroid Build Coastguard Worker /// @param c Counter which we want to retrieve a value
48*61046927SAndroid Build Coastguard Worker /// @param d Driver used to sample performance counters
49*61046927SAndroid Build Coastguard Worker /// @return The value of the counter
50*61046927SAndroid Build Coastguard Worker using Getter = Value(const Counter &c, const Driver &d);
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Worker Counter() = default;
53*61046927SAndroid Build Coastguard Worker virtual ~Counter() = default;
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker /// @param id ID of the counter
56*61046927SAndroid Build Coastguard Worker /// @param name Name of the counter
57*61046927SAndroid Build Coastguard Worker /// @param group Group ID this counter belongs to
58*61046927SAndroid Build Coastguard Worker Counter(int32_t id, const std::string &name, int32_t group);
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker bool operator==(const Counter &c) const;
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker /// @param get New getter function for this counter
63*61046927SAndroid Build Coastguard Worker void set_getter(const std::function<Getter> &get);
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker /// @brief d Driver used to sample performance counters
66*61046927SAndroid Build Coastguard Worker /// @return Last sampled value for this counter
67*61046927SAndroid Build Coastguard Worker Value get_value(const Driver &d) const;
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Worker /// Id of the counter
70*61046927SAndroid Build Coastguard Worker int32_t id = -1;
71*61046927SAndroid Build Coastguard Worker
72*61046927SAndroid Build Coastguard Worker /// Name of the counter
73*61046927SAndroid Build Coastguard Worker std::string name = "";
74*61046927SAndroid Build Coastguard Worker
75*61046927SAndroid Build Coastguard Worker /// ID of the group this counter belongs to
76*61046927SAndroid Build Coastguard Worker int32_t group = -1;
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker /// Offset of this counter within GPU counter list
79*61046927SAndroid Build Coastguard Worker /// For derived counters it is negative and remains unused
80*61046927SAndroid Build Coastguard Worker int32_t offset = -1;
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker /// Whether it is a derived counter or not
83*61046927SAndroid Build Coastguard Worker bool derived = false;
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker /// Returns the value of this counter
86*61046927SAndroid Build Coastguard Worker std::function<Getter> getter;
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker /// The unit of the counter
89*61046927SAndroid Build Coastguard Worker Units units;
90*61046927SAndroid Build Coastguard Worker };
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker /// @param get New getter function for this counter
set_getter(const std::function<Getter> & get)93*61046927SAndroid Build Coastguard Worker inline void Counter::set_getter(const std::function<Getter> &get)
94*61046927SAndroid Build Coastguard Worker {
95*61046927SAndroid Build Coastguard Worker getter = get;
96*61046927SAndroid Build Coastguard Worker }
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker /// @brief d Driver used to sample performance counters
99*61046927SAndroid Build Coastguard Worker /// @return Last sampled value for this counter
get_value(const Driver & d)100*61046927SAndroid Build Coastguard Worker inline Counter::Value Counter::get_value(const Driver &d) const
101*61046927SAndroid Build Coastguard Worker {
102*61046927SAndroid Build Coastguard Worker return getter(*this, d);
103*61046927SAndroid Build Coastguard Worker }
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker /// @return The underlying u32 value
to_u32(T && elem)106*61046927SAndroid Build Coastguard Worker template<typename T> constexpr uint32_t to_u32(T &&elem)
107*61046927SAndroid Build Coastguard Worker {
108*61046927SAndroid Build Coastguard Worker return static_cast<uint32_t>(elem);
109*61046927SAndroid Build Coastguard Worker }
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Worker } // namespace pps
112