2#include "gaia/config/config.h"
3#include "gaia/core/utility.h"
5#ifndef GAIA_PROFILER_CPU
6 #define GAIA_PROFILER_CPU 0
8#ifndef GAIA_PROFILER_MEM
9 #define GAIA_PROFILER_MEM 0
12#if GAIA_PROFILER_CPU || GAIA_PROFILER_MEM
18GAIA_MSVC_WARNING_PUSH()
19GAIA_MSVC_WARNING_DISABLE(4668)
20 #include <tracy/Tracy.hpp>
21 #include <tracy/TracyC.h>
22GAIA_MSVC_WARNING_POP()
28 inline constexpr size_t TracyFileMaxLen = 4096;
29 inline constexpr size_t TracyFunctionMaxLen = 16384;
30 inline constexpr size_t TracyZoneNameMaxLen = 128;
33 class gaia_LockableExt:
public Lockable<T> {
35 tracy_force_inline gaia_LockableExt(
const SourceLocationData* srcloc): Lockable<T>(srcloc) {}
48 T* ptr_lockable =
reinterpret_cast<T*
>(
this);
49 return (T&)*(ptr_lockable + 0);
53 #define LockableBaseExt(type) tracy::gaia_LockableExt<type>
54 #define TracyLockableExt(type, varname) \
55 tracy::gaia_LockableExt<type> varname { \
56 []() -> const tracy::SourceLocationData* { \
57 static constexpr tracy::SourceLocationData srcloc{nullptr, #type " " #varname, TracyFile, TracyLine, 0}; \
66 ZoneRT(
const char* name,
const char* file, uint32_t line,
const char* function) {
67 const auto srcloc = ___tracy_alloc_srcloc_name(
68 line, file, GAIA_STRLEN(file, TracyFileMaxLen), function, GAIA_STRLEN(function, TracyFunctionMaxLen), name,
69 GAIA_STRLEN(name, TracyZoneNameMaxLen), 0);
70 m_ctx = ___tracy_emit_zone_begin_alloc(srcloc, 1);
78 static constexpr uint32_t StackSize = 64;
81 TracyCZoneCtx buffer[StackSize];
84 inline thread_local ScopeStack t_ScopeStack;
86 inline void ZoneBegin(
const ___tracy_source_location_data* srcloc) {
87 auto& stack = t_ScopeStack;
88 const auto pos = stack.count++;
89 if (pos < ScopeStack::StackSize) {
90 stack.buffer[pos] = ___tracy_emit_zone_begin(srcloc, 1);
94 inline void ZoneRTBegin(uint64_t srcloc) {
95 auto& stack = t_ScopeStack;
96 const auto pos = stack.count++;
97 if (pos < ScopeStack::StackSize)
98 stack.buffer[pos] = ___tracy_emit_zone_begin_alloc(srcloc, 1);
101 inline void ZoneEnd() {
102 auto& stack = t_ScopeStack;
103 GAIA_ASSERT(stack.count > 0);
104 const auto pos = --stack.count;
105 if (pos < ScopeStack::StackSize)
106 ___tracy_emit_zone_end(stack.buffer[pos]);
110 #define TRACY_ZoneNamedRT(name, function) \
111 tracy::ZoneRT TracyConcat(__tracy_zone_dynamic, __LINE__)(name, __FILE__, __LINE__, function);
113 #define TRACY_ZoneNamedRTBegin(name, function) \
114 tracy::ZoneRTBegin(___tracy_alloc_srcloc_name( \
115 __LINE__, __FILE__, GAIA_STRLEN(__FILE__, tracy::TracyFileMaxLen), function, \
116 GAIA_STRLEN(function, tracy::TracyFunctionMaxLen), name, GAIA_STRLEN(name, tracy::TracyZoneNameMaxLen), 0));
118 #define TRACY_ZoneBegin(name, function) \
119 static constexpr ___tracy_source_location_data TracyConcat(__tracy_source_location, __LINE__) { \
120 name "", function, __FILE__, uint32_t(__LINE__), 0, \
122 #define TRACY_ZoneEnd() tracy::ZoneEnd
124 #define GAIA_PROF_START_IMPL(name, function) \
125 TRACY_ZoneBegin(name, function); \
126 tracy::ZoneBegin(&TracyConcat(__tracy_source_location, __LINE__));
128 #define GAIA_PROF_STOP_IMPL() TRACY_ZoneEnd()
130 #define GAIA_PROF_SCOPE_IMPL(name) ZoneNamedN(GAIA_CONCAT(___tracy_scoped_zone_, __LINE__), name "", 1)
131 #define GAIA_PROF_SCOPE_DYN_IMPL(name) TRACY_ZoneNamedRT(name, GAIA_PRETTY_FUNCTION)
138 #if !defined(GAIA_PROF_FRAME)
139 #define GAIA_PROF_FRAME() FrameMark
142 #if !defined(GAIA_PROF_SCOPE)
143 #define GAIA_PROF_SCOPE(zoneName) GAIA_PROF_SCOPE_IMPL(#zoneName)
146 #if !defined(GAIA_PROF_SCOPE2)
147 #define GAIA_PROF_SCOPE2(zoneName) GAIA_PROF_SCOPE_DYN_IMPL(zoneName)
150 #if !defined(GAIA_PROF_START)
151 #define GAIA_PROF_START(zoneName) GAIA_PROF_START_IMPL(#zoneName, GAIA_PRETTY_FUNCTION)
154 #if !defined(GAIA_PROF_STOP)
155 #define GAIA_PROF_STOP() GAIA_PROF_STOP_IMPL()
158 #if !defined(GAIA_PROF_MUTEX_BASE)
159 #define GAIA_PROF_EXTRACT_MUTEX(name) (name).get_lock()
160 #define GAIA_PROF_MUTEX_BASE(type) LockableBaseExt<type>
161 #define GAIA_PROF_LOCK_MARK(name) LockMark(name)
163 #if !defined(GAIA_PROF_MUTEX)
164 #define GAIA_PROF_MUTEX(type, name) TracyLockableExt(type, name)
167 #if !defined(GAIA_PROF_USE_PROFILER_THREAD_NAME)
168 #define GAIA_PROF_USE_PROFILER_THREAD_NAME 1
171 #if !defined(GAIA_PROF_THREAD_NAME)
172 #define GAIA_PROF_THREAD_NAME(name) tracy::SetThreadName(name)
176 #if !defined(GAIA_PROF_FRAME)
177 #define GAIA_PROF_FRAME()
180 #if !defined(GAIA_PROF_SCOPE)
181 #define GAIA_PROF_SCOPE(zoneName)
184 #if !defined(GAIA_PROF_SCOPE2)
185 #define GAIA_PROF_SCOPE2(zoneName)
188 #if !defined(GAIA_PROF_START)
189 #define GAIA_PROF_START(zoneName)
192 #if !defined(GAIA_PROF_STOP)
193 #define GAIA_PROF_STOP()
196 #if !defined(GAIA_PROF_MUTEX_BASE)
197 #define GAIA_PROF_EXTRACT_MUTEX(name) name
198 #define GAIA_PROF_MUTEX_BASE(type) type
199 #define GAIA_PROF_LOCK_MARK(name)
201 #if !defined(GAIA_PROF_MUTEX)
202 #define GAIA_PROF_MUTEX(type, name) GAIA_PROF_MUTEX_BASE(type) name
205 #if !defined(GAIA_PROF_USE_PROFILER_THREAD_NAME)
206 #define GAIA_PROF_USE_PROFILER_THREAD_NAME 0
209 #if !defined(GAIA_PROF_THREAD_NAME)
210 #define GAIA_PROF_THREAD_NAME(name)
216 #if !defined(GAIA_PROF_ALLOC)
217 #define GAIA_PROF_ALLOC(ptr, size) TracyAlloc(ptr, size)
220 #if !defined(GAIA_PROF_ALLOC2)
221 #define GAIA_PROF_ALLOC2(ptr, size, name) TracyAllocN(ptr, size, name)
224 #if !defined(GAIA_PROF_FREE)
225 #define GAIA_PROF_FREE(ptr) TracyFree(ptr)
228 #if !defined(GAIA_PROF_FREE2)
229 #define GAIA_PROF_FREE2(ptr, name) TracyFreeN(ptr, name)
233 #if !defined(GAIA_PROF_ALLOC)
234 #define GAIA_PROF_ALLOC(ptr, size)
237 #if !defined(GAIA_PROF_ALLOC2)
238 #define GAIA_PROF_ALLOC2(ptr, size, name)
241 #if !defined(GAIA_PROF_FREE)
242 #define GAIA_PROF_FREE(ptr)
245 #if !defined(GAIA_PROF_FREE2)
246 #define GAIA_PROF_FREE2(ptr, name)