mesa/src/tool/pps/pps_counter.h

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