diff --git a/client/Tracy.hpp b/client/Tracy.hpp index 05caf9e4..95f7fc25 100644 --- a/client/Tracy.hpp +++ b/client/Tracy.hpp @@ -16,6 +16,8 @@ #define LockableBase( type ) type #define LockMark(x) +#define TracyPlot(x,y) + #else #include "TracyLock.hpp" @@ -35,6 +37,8 @@ #define LockableBase( type ) tracy::Lockable #define LockMark( varname ) static const tracy::SourceLocation __tracy_lock_location_##varname { __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; varname.Mark( &__tracy_lock_location_##varname ); +#define TracyPlot( name, val ) tracy::Profiler::PlotData( name, val ); + #endif #endif diff --git a/client/TracyProfiler.hpp b/client/TracyProfiler.hpp index c8180a51..6acf5258 100644 --- a/client/TracyProfiler.hpp +++ b/client/TracyProfiler.hpp @@ -82,6 +82,20 @@ public: tail.store( magic + 1, std::memory_order_release ); } + static tracy_force_inline void PlotData( const char* name, double val ) + { + uint32_t cpu; + Magic magic; + auto& token = s_token.ptr; + auto& tail = token->get_tail_index(); + auto item = token->enqueue_begin( magic ); + item->hdr.type = QueueType::PlotData; + item->plotData.name = (uint64_t)name; + item->plotData.time = GetTime( cpu ); + item->plotData.val = val; + tail.store( magic + 1, std::memory_order_release ); + } + static bool ShouldExit(); private: diff --git a/common/TracyQueue.hpp b/common/TracyQueue.hpp index b452e983..7f33e69a 100644 --- a/common/TracyQueue.hpp +++ b/common/TracyQueue.hpp @@ -21,6 +21,7 @@ enum class QueueType : uint8_t LockObtain, LockRelease, LockMark, + PlotData, NUM_TYPES }; @@ -101,6 +102,13 @@ struct QueueLockMark uint64_t srcloc; // ptr }; +struct QueuePlotData +{ + uint64_t name; // ptr + int64_t time; + double val; +}; + struct QueueHeader { union @@ -126,6 +134,7 @@ struct QueueItem QueueLockObtain lockObtain; QueueLockRelease lockRelease; QueueLockMark lockMark; + QueuePlotData plotData; }; }; @@ -147,6 +156,7 @@ static const size_t QueueDataSize[] = { sizeof( QueueHeader ) + sizeof( QueueLockObtain ), sizeof( QueueHeader ) + sizeof( QueueLockRelease ), sizeof( QueueHeader ) + sizeof( QueueLockMark ), + sizeof( QueueHeader ) + sizeof( QueuePlotData ), }; static_assert( sizeof( QueueDataSize ) / sizeof( size_t ) == (uint8_t)QueueType::NUM_TYPES, "QueueDataSize mismatch" );