diff --git a/TracyLua.hpp b/TracyLua.hpp new file mode 100644 index 00000000..eb02073c --- /dev/null +++ b/TracyLua.hpp @@ -0,0 +1,132 @@ +#ifndef __TRACYLUA_HPP__ +#define __TRACYLUA_HPP__ + +#include + +#include "common/TracySystem.hpp" +#include "client/TracyProfiler.hpp" + +namespace tracy +{ + +#ifndef TRACY_ENABLE + +namespace detail +{ +static inline int noop( lua_State* L ) { return 0; } +} + +static inline void LuaRegister( lua_State* L ) +{ + lua_newtable( L ); + lua_pushcfunction( L, detail::noop ); + lua_setfield( L, -2, "ZoneBegin" ); + lua_pushcfunction( L, detail::noop ); + lua_setfield( L, -2, "ZoneEnd" ); + lua_setglobal( L, "tracy" ); +} + +static inline void LuaRemove( char* script ) +{ + while( *script ) + { + if( strncmp( script, "tracy.Zone", 10 ) == 0 ) + { + if( strncmp( script + 10, "End()", 5 ) == 0 ) + { + memset( script, ' ', 15 ); + script += 15; + } + else if( strncmp( script + 10, "Begin()", 7 ) == 0 ) + { + memset( script, ' ', 17 ); + script += 17; + } + else + { + script += 10; + } + } + else + { + script++; + } + } +} + +#else + +namespace detail +{ + +static inline int LuaZoneBegin( lua_State* L ) +{ + const uint32_t color = 0x00DD6666; + + lua_Debug dbg; + lua_getstack( L, 1, &dbg ); + lua_getinfo( L, "Snl", &dbg ); + + const uint32_t line = dbg.currentline; + const auto fsz = strlen( dbg.name ); + const auto ssz = strlen( dbg.source ); + + // Data layout: + // 4b payload size + // 4b color + // 4b source line + // fsz function name + // 1b null terminator + // ssz source file name + const uint32_t sz = 4 + 4 + 4 + fsz + 1 + ssz; + auto ptr = (char*)tracy_malloc( sz ); + memcpy( ptr, &sz, 4 ); + memcpy( ptr + 4, &color, 4 ); + memcpy( ptr + 8, &line, 4 ); + memcpy( ptr + 12, dbg.name, fsz+1 ); + memcpy( ptr + 12 + fsz + 1, dbg.source, ssz ); + + Magic magic; + auto& token = s_token.ptr; + auto& tail = token->get_tail_index(); + auto item = token->enqueue_begin( magic ); + item->hdr.type = QueueType::ZoneBeginAllocSrcLoc; + item->zoneBegin.time = Profiler::GetTime( item->zoneBegin.cpu ); + item->zoneBegin.thread = GetThreadHandle(); + item->zoneBegin.srcloc = (uint64)ptr; + tail.store( magic + 1, std::memory_order_release ); + return 0; +} + +static inline int LuaZoneEnd( lua_State* L ) +{ + Magic magic; + auto& token = s_token.ptr; + auto& tail = token->get_tail_index(); + auto item = token->enqueue_begin( magic ); + item->hdr.type = QueueType::ZoneEnd; + item->zoneEnd.time = Profiler::GetTime( item->zoneEnd.cpu ); + item->zoneEnd.thread = GetThreadHandle(); + tail.store( magic + 1, std::memory_order_release ); + return 0; +} + +} + +static inline void LuaRegister( lua_State* L ) +{ + lua_newtable( L ); + lua_pushcfunction( L, detail::LuaZoneBegin ); + lua_setfield( L, -2, "ZoneBegin" ); + lua_pushcfunction( L, detail::LuaZoneEnd ); + lua_setfield( L, -2, "ZoneEnd" ); + lua_setglobal( L, "tracy" ); +} + +static inline void LuaRemove( char* script ) {} + +#endif + +} + +#endif diff --git a/common/TracyQueue.hpp b/common/TracyQueue.hpp index d2814e99..dde53723 100644 --- a/common/TracyQueue.hpp +++ b/common/TracyQueue.hpp @@ -10,6 +10,7 @@ enum class QueueType : uint8_t { Terminate, ZoneBegin, + ZoneBeginAllocSrcLoc, ZoneEnd, StringData, ThreadName, @@ -173,6 +174,7 @@ enum { QueueItemSize = sizeof( QueueItem ) }; static const size_t QueueDataSize[] = { sizeof( QueueHeader ), // terminate sizeof( QueueHeader ) + sizeof( QueueZoneBegin ), + sizeof( QueueHeader ) + sizeof( QueueZoneBegin ), // allocated source location sizeof( QueueHeader ) + sizeof( QueueZoneEnd ), sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // string data sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // thread name diff --git a/server/TracyView.cpp b/server/TracyView.cpp index 0760c969..ccb1a11a 100644 --- a/server/TracyView.cpp +++ b/server/TracyView.cpp @@ -609,6 +609,9 @@ void View::Process( const QueueItem& ev ) case QueueType::ZoneBegin: ProcessZoneBegin( ev.zoneBegin ); break; + case QueueType::ZoneBeginAllocSrcLoc: + ProcessZoneBeginAllocSrcLoc( ev.zoneBegin ); + break; case QueueType::ZoneEnd: ProcessZoneEnd( ev.zoneEnd ); break; @@ -673,6 +676,26 @@ void View::ProcessZoneBegin( const QueueZoneBegin& ev ) m_zoneStack[ev.thread].push_back( zone ); } +void View::ProcessZoneBeginAllocSrcLoc( const QueueZoneBegin& ev ) +{ + auto zone = m_slab.AllocInit(); + + //CheckSourceLocation( ev.srcloc ); + + zone->start = ev.time * m_timerMul; + zone->end = -1; + //zone->srcloc = ShrinkSourceLocation( ev.srcloc ); + zone->srcloc = 0; + assert( ev.cpu == 0xFFFFFFFF || ev.cpu <= std::numeric_limits::max() ); + zone->cpu_start = ev.cpu == 0xFFFFFFFF ? -1 : (int8_t)ev.cpu; + zone->text = -1; + + std::unique_lock lock( m_lock ); + NewZone( zone, ev.thread ); + lock.unlock(); + m_zoneStack[ev.thread].push_back( zone ); +} + void View::ProcessZoneEnd( const QueueZoneEnd& ev ) { auto& stack = m_zoneStack[ev.thread]; diff --git a/server/TracyView.hpp b/server/TracyView.hpp index d342bd07..8f29c86a 100644 --- a/server/TracyView.hpp +++ b/server/TracyView.hpp @@ -124,6 +124,7 @@ private: void Process( const QueueItem& ev ); void ProcessZoneBegin( const QueueZoneBegin& ev ); + void ProcessZoneBeginAllocSrcLoc( const QueueZoneBegin& ev ); void ProcessZoneEnd( const QueueZoneEnd& ev ); void ProcessFrameMark( const QueueFrameMark& ev ); void ProcessZoneText( const QueueZoneText& ev );