nngn
Loading...
Searching...
No Matches
profile.h
Go to the documentation of this file.
1#ifndef NNGN_TIMING_PROFILE_H
2#define NNGN_TIMING_PROFILE_H
3
4#include <array>
5#include <cstddef>
6#include <cstdint>
7#include <tuple>
8
9#include "utils/utils.h"
10
11#include "stats.h"
12#include "timing.h"
13
14namespace nngn {
15
16#define NNGN_STATS_CONTEXT(c, p) \
17 const auto NNGN_STATS_CONTEXT_VAR(__LINE__) = nngn::Profile::context<c>(p);
18#define NNGN_PROFILE_CONTEXT(p) \
19 NNGN_STATS_CONTEXT(nngn::Profile, &nngn::Profile::stats.p)
20#define NNGN_STATS_CONTEXT_VAR(l) NNGN_STATS_CONTEXT_JOIN(prof_, l)
21#define NNGN_STATS_CONTEXT_JOIN(x, y) x##y
22
23struct ProfileStats : StatsBase<ProfileStats, 2> {
24 std::array<uint64_t, 2>
26 static constexpr std::array names = {
27 "schedule", "socket", "renderers", "renderers_debug", "render",
28 "vsync",
29 };
30 const uint64_t *to_u64() const { return this->schedule.data(); }
31 uint64_t *to_u64() { return this->schedule.data(); }
32};
33
34struct Profile {
36 static constexpr size_t STATS_IDX = 0;
37 template<typename T>
38 struct context {
39 static constexpr auto I = T::STATS_IDX;
40 static constexpr auto N = T::Stats::N_EVENTS;
41 std::array<uint64_t, N> *p;
43 explicit context(std::array<uint64_t, N> *p);
44 ~context(void) { this->end(); }
45 void end();
46 };
48 static Timing::duration::rep sample();
49 static void init();
50 static void swap();
51};
52
53template<typename T>
54inline Profile::context<T>::context(std::array<uint64_t, N> *p_) : p(p_) {
56 this->p->front() = static_cast<uint64_t>(Profile::sample());
57}
58
59template<typename T>
62 if(auto *const op = std::exchange(this->p, nullptr))
63 op->back() = static_cast<uint64_t>(Profile::sample());
64}
65
66inline void Profile::init()
68
70
71inline Timing::duration::rep Profile::sample()
72 { return nngn::Timing::clock::now().time_since_epoch().count(); }
73
74}
75
76#endif
static bool active(std::size_t i)
Definition: stats.h:29
static void reserve(std::size_t i, void *p)
Definition: stats.h:60
Definition: debug.h:45
Definition: profile.h:23
uint64_t * to_u64()
Definition: profile.h:31
const uint64_t * to_u64() const
Definition: profile.h:30
std::array< uint64_t, 2 > renderers
Definition: profile.h:25
static constexpr std::array names
Definition: profile.h:26
std::array< uint64_t, 2 > render
Definition: profile.h:25
std::array< uint64_t, 2 > schedule
Definition: profile.h:25
std::array< uint64_t, 2 > renderers_debug
Definition: profile.h:25
std::array< uint64_t, 2 > vsync
Definition: profile.h:25
std::array< uint64_t, 2 > socket
Definition: profile.h:25
Definition: profile.h:38
std::array< uint64_t, N > * p
Definition: profile.h:41
static constexpr auto I
Definition: profile.h:39
~context(void)
Definition: profile.h:44
context(std::array< uint64_t, N > *p)
Definition: profile.h:54
static constexpr auto N
Definition: profile.h:40
void end()
Definition: profile.h:60
Definition: profile.h:34
static void init()
Definition: profile.h:66
static void swap()
Definition: profile.h:69
static constexpr size_t STATS_IDX
Definition: profile.h:36
static ProfileStats prev
Definition: profile.h:47
static ProfileStats stats
Definition: profile.h:47
static Timing::duration::rep sample()
Definition: profile.h:71
Definition: stats.h:15
#define NNGN_MOVE_ONLY(x)
Definition: utils.h:39