2#include "gaia/config/config.h"
4#ifndef GAIA_PROFILER_CPU
5 #define GAIA_PROFILER_CPU 0
7#ifndef GAIA_PROFILER_MEM
8 #define GAIA_PROFILER_MEM 0
11#if GAIA_PROFILER_CPU || GAIA_PROFILER_MEM
17GAIA_MSVC_WARNING_PUSH()
18GAIA_MSVC_WARNING_DISABLE(4668)
19 #include <tracy/Tracy.hpp>
20 #include <tracy/TracyC.h>
21GAIA_MSVC_WARNING_POP()
29 class gaia_LockableExt:
public Lockable<T> {
31 tracy_force_inline gaia_LockableExt(
const SourceLocationData* srcloc): Lockable<T>(srcloc) {}
44 T* ptr_lockable =
reinterpret_cast<T*
>(
this);
45 return (T&)*(ptr_lockable + 0);
49 #define LockableBaseExt(type) tracy::gaia_LockableExt<type>
50 #define TracyLockableExt(type, varname) \
51 tracy::gaia_LockableExt<type> varname { \
52 []() -> const tracy::SourceLocationData* { \
53 static constexpr tracy::SourceLocationData srcloc{nullptr, #type " " #varname, TracyFile, TracyLine, 0}; \
62 ZoneRT(
const char* name,
const char* file, uint32_t line,
const char* function) {
64 ___tracy_alloc_srcloc_name(line, file, strlen(file), function, strlen(function), name, strlen(name), 0);
65 m_ctx = ___tracy_emit_zone_begin_alloc(srcloc, 1);
73 static constexpr uint32_t StackSize = 64;
76 TracyCZoneCtx buffer[StackSize];
79 inline thread_local ScopeStack t_ScopeStack;
81 inline void ZoneBegin(
const ___tracy_source_location_data* srcloc) {
82 auto& stack = t_ScopeStack;
83 const auto pos = stack.count++;
84 if (pos < ScopeStack::StackSize) {
85 stack.buffer[pos] = ___tracy_emit_zone_begin(srcloc, 1);
89 inline void ZoneRTBegin(uint64_t srcloc) {
90 auto& stack = t_ScopeStack;
91 const auto pos = stack.count++;
92 if (pos < ScopeStack::StackSize)
93 stack.buffer[pos] = ___tracy_emit_zone_begin_alloc(srcloc, 1);
96 inline void ZoneEnd() {
97 auto& stack = t_ScopeStack;
98 GAIA_ASSERT(stack.count > 0);
99 const auto pos = --stack.count;
100 if (pos < ScopeStack::StackSize)
101 ___tracy_emit_zone_end(stack.buffer[pos]);
105 #define TRACY_ZoneNamedRT(name, function) \
106 tracy::ZoneRT TracyConcat(__tracy_zone_dynamic, __LINE__)(name, __FILE__, __LINE__, function);
108 #define TRACY_ZoneNamedRTBegin(name, function) \
109 tracy::ZoneRTBegin(___tracy_alloc_srcloc_name( \
110 __LINE__, __FILE__, strlen(__FILE__), function, strlen(function), name, strlen(name), 0));
112 #define TRACY_ZoneBegin(name, function) \
113 static constexpr ___tracy_source_location_data TracyConcat(__tracy_source_location, __LINE__) { \
114 name "", function, __FILE__, uint32_t(__LINE__), 0, \
116 #define TRACY_ZoneEnd() tracy::ZoneEnd
118 #define GAIA_PROF_START_IMPL(name, function) \
119 TRACY_ZoneBegin(name, function); \
120 tracy::ZoneBegin(&TracyConcat(__tracy_source_location, __LINE__));
122 #define GAIA_PROF_STOP_IMPL() TRACY_ZoneEnd()
124 #define GAIA_PROF_SCOPE_IMPL(name) ZoneNamedN(GAIA_CONCAT(___tracy_scoped_zone_, __LINE__), name "", 1)
125 #define GAIA_PROF_SCOPE_DYN_IMPL(name) TRACY_ZoneNamedRT(name, GAIA_PRETTY_FUNCTION)
132 #if !defined(GAIA_PROF_FRAME)
133 #define GAIA_PROF_FRAME() FrameMark
136 #if !defined(GAIA_PROF_SCOPE)
137 #define GAIA_PROF_SCOPE(zoneName) GAIA_PROF_SCOPE_IMPL(#zoneName)
140 #if !defined(GAIA_PROF_SCOPE2)
141 #define GAIA_PROF_SCOPE2(zoneName) GAIA_PROF_SCOPE_DYN_IMPL(zoneName)
144 #if !defined(GAIA_PROF_START)
145 #define GAIA_PROF_START(zoneName) GAIA_PROF_START_IMPL(#zoneName, GAIA_PRETTY_FUNCTION)
148 #if !defined(GAIA_PROF_STOP)
149 #define GAIA_PROF_STOP() GAIA_PROF_STOP_IMPL()
152 #if !defined(GAIA_PROF_MUTEX_BASE)
153 #define GAIA_PROF_EXTRACT_MUTEX(name) (name).get_lock()
154 #define GAIA_PROF_MUTEX_BASE(type) LockableBaseExt<type>
155 #define GAIA_PROF_LOCK_MARK(name) LockMark(name)
157 #if !defined(GAIA_PROF_MUTEX)
158 #define GAIA_PROF_MUTEX(type, name) TracyLockableExt(type, name)
161 #if !defined(GAIA_PROF_USE_PROFILER_THREAD_NAME)
162 #define GAIA_PROF_USE_PROFILER_THREAD_NAME 1
165 #if !defined(GAIA_PROF_THREAD_NAME)
166 #define GAIA_PROF_THREAD_NAME(name) tracy::SetThreadName(name)
170 #if !defined(GAIA_PROF_FRAME)
171 #define GAIA_PROF_FRAME()
174 #if !defined(GAIA_PROF_SCOPE)
175 #define GAIA_PROF_SCOPE(zoneName)
178 #if !defined(GAIA_PROF_SCOPE2)
179 #define GAIA_PROF_SCOPE2(zoneName)
182 #if !defined(GAIA_PROF_START)
183 #define GAIA_PROF_START(zoneName)
186 #if !defined(GAIA_PROF_STOP)
187 #define GAIA_PROF_STOP()
190 #if !defined(GAIA_PROF_MUTEX_BASE)
191 #define GAIA_PROF_EXTRACT_MUTEX(name) name
192 #define GAIA_PROF_MUTEX_BASE(type) type
193 #define GAIA_PROF_LOCK_MARK(name)
195 #if !defined(GAIA_PROF_MUTEX)
196 #define GAIA_PROF_MUTEX(type, name) GAIA_PROF_MUTEX_BASE(type) name
199 #if !defined(GAIA_PROF_USE_PROFILER_THREAD_NAME)
200 #define GAIA_PROF_USE_PROFILER_THREAD_NAME 0
203 #if !defined(GAIA_PROF_THREAD_NAME)
204 #define GAIA_PROF_THREAD_NAME(name)
210 #if !defined(GAIA_PROF_ALLOC)
211 #define GAIA_PROF_ALLOC(ptr, size) TracyAlloc(ptr, size)
214 #if !defined(GAIA_PROF_ALLOC2)
215 #define GAIA_PROF_ALLOC2(ptr, size, name) TracyAllocN(ptr, size, name)
218 #if !defined(GAIA_PROF_FREE)
219 #define GAIA_PROF_FREE(ptr) TracyFree(ptr)
222 #if !defined(GAIA_PROF_FREE2)
223 #define GAIA_PROF_FREE2(ptr, name) TracyFreeN(ptr, name)
227 #if !defined(GAIA_PROF_ALLOC)
228 #define GAIA_PROF_ALLOC(ptr, size)
231 #if !defined(GAIA_PROF_ALLOC2)
232 #define GAIA_PROF_ALLOC2(ptr, size, name)
235 #if !defined(GAIA_PROF_FREE)
236 #define GAIA_PROF_FREE(ptr)
239 #if !defined(GAIA_PROF_FREE2)
240 #define GAIA_PROF_FREE2(ptr, name)