111 lines
2.6 KiB
C++
111 lines
2.6 KiB
C++
/*
|
|
* Copyright © 2020 Collabora, Ltd.
|
|
* Author: Antonio Caggiano <antonio.caggiano@collabora.com>
|
|
* Author: Rohan Garg <rohan.garg@collabora.com>
|
|
* Author: Robert Beckett <bob.beckett@collabora.com>
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <functional>
|
|
#include <string>
|
|
#include <variant>
|
|
#include <vector>
|
|
|
|
namespace pps
|
|
{
|
|
struct CounterGroup {
|
|
std::string name;
|
|
|
|
uint32_t id;
|
|
|
|
/// List of counters ID belonging to this group
|
|
std::vector<int32_t> counters;
|
|
|
|
std::vector<CounterGroup> subgroups;
|
|
};
|
|
|
|
class Driver;
|
|
|
|
class Counter
|
|
{
|
|
public:
|
|
/// @brief A counter value can be of different types depending on what it represents:
|
|
/// cycles, cycles-per-instruction, percentages, bytes, and so on.
|
|
enum class Units {
|
|
Percent,
|
|
Byte,
|
|
Hertz,
|
|
None,
|
|
};
|
|
|
|
using Value = std::variant<int64_t, double>;
|
|
|
|
/// @param c Counter which we want to retrieve a value
|
|
/// @param d Driver used to sample performance counters
|
|
/// @return The value of the counter
|
|
using Getter = Value(const Counter &c, const Driver &d);
|
|
|
|
Counter() = default;
|
|
virtual ~Counter() = default;
|
|
|
|
/// @param id ID of the counter
|
|
/// @param name Name of the counter
|
|
/// @param group Group ID this counter belongs to
|
|
Counter(int32_t id, const std::string &name, int32_t group);
|
|
|
|
bool operator==(const Counter &c) const;
|
|
|
|
/// @param get New getter function for this counter
|
|
void set_getter(const std::function<Getter> &get);
|
|
|
|
/// @brief d Driver used to sample performance counters
|
|
/// @return Last sampled value for this counter
|
|
Value get_value(const Driver &d) const;
|
|
|
|
/// Id of the counter
|
|
int32_t id = -1;
|
|
|
|
/// Name of the counter
|
|
std::string name = "";
|
|
|
|
/// ID of the group this counter belongs to
|
|
int32_t group = -1;
|
|
|
|
/// Offset of this counter within GPU counter list
|
|
/// For derived counters it is negative and remains unused
|
|
int32_t offset = -1;
|
|
|
|
/// Whether it is a derived counter or not
|
|
bool derived = false;
|
|
|
|
/// Returns the value of this counter
|
|
std::function<Getter> getter;
|
|
|
|
/// The unit of the counter
|
|
Units units;
|
|
};
|
|
|
|
/// @param get New getter function for this counter
|
|
inline void Counter::set_getter(const std::function<Getter> &get)
|
|
{
|
|
getter = get;
|
|
}
|
|
|
|
/// @brief d Driver used to sample performance counters
|
|
/// @return Last sampled value for this counter
|
|
inline Counter::Value Counter::get_value(const Driver &d) const
|
|
{
|
|
return getter(*this, d);
|
|
}
|
|
|
|
/// @return The underlying u32 value
|
|
template<typename T> constexpr uint32_t to_u32(T &&elem)
|
|
{
|
|
return static_cast<uint32_t>(elem);
|
|
}
|
|
|
|
} // namespace pps
|