forked from EasyRPG/Player
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinstrumentation.h
140 lines (119 loc) · 3.17 KB
/
instrumentation.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
* This file is part of EasyRPG Player.
*
* EasyRPG Player is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EasyRPG Player is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EasyRPG Player. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef EP_INSTRUMENTATION_H
#define EP_INSTRUMENTATION_H
#if defined(PLAYER_INSTRUMENTATION) && PLAYER_INSTRUMENTATION == VTune
#define PLAYER_INSTRUMENTATION_VTUNE
#endif
#ifdef PLAYER_INSTRUMENTATION_VTUNE
#include <ittnotify.h>
#endif
#include <cassert>
class Instrumentation {
public:
/**
* Must be called once on startup to initialize the instrumentation framework.
*
* @param name name of instrumentation domain
*/
static void Init(const char* name);
/** Call at the beginning of a frame */
static void FrameBegin();
/** Call at the end of a frame */
static void FrameEnd();
/** RAII wrapper around FrameBegin() / FrameEnd() */
class FrameScope {
public:
/**
* Create a FrameScope
*
* @param frame_begin if true, call Begin()
*/
FrameScope(bool frame_begin = true);
FrameScope(const FrameScope&) = delete;
FrameScope& operator=(const FrameScope&) = delete;
/** Take ownership of Frame scope */
FrameScope(FrameScope&&) noexcept;
/** Take ownership of Frame scope */
FrameScope& operator=(FrameScope&&) noexcept;
/** Calls End() */
~FrameScope();
/** Calls FrameBegin() if not already begin */
void Begin() noexcept;
/** Calls FrameEnd() if Begin() was called */
void End() noexcept;
/** Disables the FrameScope */
void Dismiss() noexcept;
private:
bool begun = false;
};
private:
#ifdef PLAYER_INSTRUMENTATION_VTUNE
static __itt_domain* domain;
#endif
};
inline void Instrumentation::FrameBegin() {
#ifdef PLAYER_INSTRUMENTATION_VTUNE
assert(domain);
__itt_frame_begin_v3(domain, nullptr);
#endif
}
inline void Instrumentation::FrameEnd() {
#ifdef PLAYER_INSTRUMENTATION_VTUNE
assert(domain);
__itt_frame_end_v3(domain, nullptr);
#endif
}
inline Instrumentation::FrameScope::FrameScope(bool frame_begin)
{
if (frame_begin) {
Begin();
}
}
inline Instrumentation::FrameScope::FrameScope(FrameScope&& o) noexcept
: begun(o.begun)
{
o.begun = false;
}
inline Instrumentation::FrameScope& Instrumentation::FrameScope::operator=(FrameScope&& o) noexcept
{
if (this != &o) {
End();
begun = o.begun;
o.begun = false;
}
return *this;
}
inline Instrumentation::FrameScope::~FrameScope() {
End();
}
inline void Instrumentation::FrameScope::Begin() noexcept {
if (!begun) {
Instrumentation::FrameBegin();
begun = true;
}
}
inline void Instrumentation::FrameScope::End() noexcept {
if (begun) {
Instrumentation::FrameEnd();
begun = false;
}
}
inline void Instrumentation::FrameScope::Dismiss() noexcept {
begun = false;
}
#endif