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