| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424 |
- #ifndef __TRACYLUA_HPP__
- #define __TRACYLUA_HPP__
- // Include this file after you include lua headers.
- #ifndef TRACY_ENABLE
- #include <string.h>
- namespace tracy
- {
- 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, "ZoneBeginN" );
- lua_pushcfunction( L, detail::noop );
- lua_setfield( L, -2, "ZoneBeginS" );
- lua_pushcfunction( L, detail::noop );
- lua_setfield( L, -2, "ZoneBeginNS" );
- lua_pushcfunction( L, detail::noop );
- lua_setfield( L, -2, "ZoneEnd" );
- lua_pushcfunction( L, detail::noop );
- lua_setfield( L, -2, "ZoneText" );
- lua_pushcfunction( L, detail::noop );
- lua_setfield( L, -2, "ZoneName" );
- lua_pushcfunction( L, detail::noop );
- lua_setfield( L, -2, "Message" );
- lua_setglobal( L, "tracy" );
- }
- static inline char* FindEnd( char* ptr )
- {
- unsigned int cnt = 1;
- while( cnt != 0 )
- {
- if( *ptr == '(' ) cnt++;
- else if( *ptr == ')' ) cnt--;
- ptr++;
- }
- return ptr;
- }
- static inline void LuaRemove( char* script )
- {
- while( *script )
- {
- if( strncmp( script, "tracy.", 6 ) == 0 )
- {
- if( strncmp( script + 6, "Zone", 4 ) == 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 if( strncmp( script + 10, "Text(", 5 ) == 0 )
- {
- auto end = FindEnd( script + 15 );
- memset( script, ' ', end - script );
- script = end;
- }
- else if( strncmp( script + 10, "Name(", 5 ) == 0 )
- {
- auto end = FindEnd( script + 15 );
- memset( script, ' ', end - script );
- script = end;
- }
- else if( strncmp( script + 10, "BeginN(", 7 ) == 0 )
- {
- auto end = FindEnd( script + 17 );
- memset( script, ' ', end - script );
- script = end;
- }
- else if( strncmp( script + 10, "BeginS(", 7 ) == 0 )
- {
- auto end = FindEnd( script + 17 );
- memset( script, ' ', end - script );
- script = end;
- }
- else if( strncmp( script + 10, "BeginNS(", 8 ) == 0 )
- {
- auto end = FindEnd( script + 18 );
- memset( script, ' ', end - script );
- script = end;
- }
- else
- {
- script += 10;
- }
- }
- else if( strncmp( script + 6, "Message(", 8 ) == 0 )
- {
- auto end = FindEnd( script + 14 );
- memset( script, ' ', end - script );
- script = end;
- }
- else
- {
- script += 6;
- }
- }
- else
- {
- script++;
- }
- }
- }
- }
- #else
- #include <assert.h>
- #include <limits>
- #include "common/TracyColor.hpp"
- #include "common/TracyAlign.hpp"
- #include "common/TracyForceInline.hpp"
- #include "common/TracySystem.hpp"
- #include "client/TracyProfiler.hpp"
- namespace tracy
- {
- #ifdef TRACY_ON_DEMAND
- TRACY_API LuaZoneState& GetLuaZoneState();
- #endif
- namespace detail
- {
- #ifdef TRACY_HAS_CALLSTACK
- static tracy_force_inline void SendLuaCallstack( lua_State* L, uint32_t depth )
- {
- assert( depth <= 64 );
- lua_Debug dbg[64];
- const char* func[64];
- uint32_t fsz[64];
- uint32_t ssz[64];
- uint8_t cnt;
- uint16_t spaceNeeded = sizeof( cnt );
- for( cnt=0; cnt<depth; cnt++ )
- {
- if( lua_getstack( L, cnt+1, dbg+cnt ) == 0 ) break;
- lua_getinfo( L, "Snl", dbg+cnt );
- func[cnt] = dbg[cnt].name ? dbg[cnt].name : dbg[cnt].short_src;
- fsz[cnt] = uint32_t( strlen( func[cnt] ) );
- ssz[cnt] = uint32_t( strlen( dbg[cnt].source ) );
- spaceNeeded += fsz[cnt] + ssz[cnt];
- }
- spaceNeeded += cnt * ( 4 + 2 + 2 ); // source line, function string length, source string length
- auto ptr = (char*)tracy_malloc( spaceNeeded + 2 );
- auto dst = ptr;
- memcpy( dst, &spaceNeeded, 2 ); dst += 2;
- memcpy( dst, &cnt, 1 ); dst++;
- for( uint8_t i=0; i<cnt; i++ )
- {
- const uint32_t line = dbg[i].currentline;
- memcpy( dst, &line, 4 ); dst += 4;
- assert( fsz[i] <= std::numeric_limits<uint16_t>::max() );
- memcpy( dst, fsz+i, 2 ); dst += 2;
- memcpy( dst, func[i], fsz[i] ); dst += fsz[i];
- assert( ssz[i] <= std::numeric_limits<uint16_t>::max() );
- memcpy( dst, ssz+i, 2 ); dst += 2;
- memcpy( dst, dbg[i].source, ssz[i] ), dst += ssz[i];
- }
- assert( dst - ptr == spaceNeeded + 2 );
- TracyLfqPrepare( QueueType::CallstackAlloc );
- MemWrite( &item->callstackAllocFat.ptr, (uint64_t)ptr );
- MemWrite( &item->callstackAllocFat.nativePtr, (uint64_t)Callstack( depth ) );
- TracyLfqCommit;
- }
- static inline int LuaZoneBeginS( lua_State* L )
- {
- #ifdef TRACY_ON_DEMAND
- const auto zoneCnt = GetLuaZoneState().counter++;
- if( zoneCnt != 0 && !GetLuaZoneState().active ) return 0;
- GetLuaZoneState().active = GetProfiler().IsConnected();
- if( !GetLuaZoneState().active ) return 0;
- #endif
- #ifdef TRACY_CALLSTACK
- const uint32_t depth = TRACY_CALLSTACK;
- #else
- const auto depth = uint32_t( lua_tointeger( L, 1 ) );
- #endif
- SendLuaCallstack( L, depth );
- TracyLfqPrepare( QueueType::ZoneBeginAllocSrcLocCallstack );
- lua_Debug dbg;
- lua_getstack( L, 1, &dbg );
- lua_getinfo( L, "Snl", &dbg );
- const auto srcloc = Profiler::AllocSourceLocation( dbg.currentline, dbg.source, dbg.name ? dbg.name : dbg.short_src );
- MemWrite( &item->zoneBegin.time, Profiler::GetTime() );
- MemWrite( &item->zoneBegin.srcloc, srcloc );
- TracyLfqCommit;
- return 0;
- }
- static inline int LuaZoneBeginNS( lua_State* L )
- {
- #ifdef TRACY_ON_DEMAND
- const auto zoneCnt = GetLuaZoneState().counter++;
- if( zoneCnt != 0 && !GetLuaZoneState().active ) return 0;
- GetLuaZoneState().active = GetProfiler().IsConnected();
- if( !GetLuaZoneState().active ) return 0;
- #endif
- #ifdef TRACY_CALLSTACK
- const uint32_t depth = TRACY_CALLSTACK;
- #else
- const auto depth = uint32_t( lua_tointeger( L, 2 ) );
- #endif
- SendLuaCallstack( L, depth );
- TracyLfqPrepare( QueueType::ZoneBeginAllocSrcLocCallstack );
- lua_Debug dbg;
- lua_getstack( L, 1, &dbg );
- lua_getinfo( L, "Snl", &dbg );
- size_t nsz;
- const auto name = lua_tolstring( L, 1, &nsz );
- const auto srcloc = Profiler::AllocSourceLocation( dbg.currentline, dbg.source, dbg.name ? dbg.name : dbg.short_src, name, nsz );
- MemWrite( &item->zoneBegin.time, Profiler::GetTime() );
- MemWrite( &item->zoneBegin.srcloc, srcloc );
- TracyLfqCommit;
- return 0;
- }
- #endif
- static inline int LuaZoneBegin( lua_State* L )
- {
- #if defined TRACY_HAS_CALLSTACK && defined TRACY_CALLSTACK
- return LuaZoneBeginS( L );
- #else
- #ifdef TRACY_ON_DEMAND
- const auto zoneCnt = GetLuaZoneState().counter++;
- if( zoneCnt != 0 && !GetLuaZoneState().active ) return 0;
- GetLuaZoneState().active = GetProfiler().IsConnected();
- if( !GetLuaZoneState().active ) return 0;
- #endif
- TracyLfqPrepare( QueueType::ZoneBeginAllocSrcLoc );
- lua_Debug dbg;
- lua_getstack( L, 1, &dbg );
- lua_getinfo( L, "Snl", &dbg );
- const auto srcloc = Profiler::AllocSourceLocation( dbg.currentline, dbg.source, dbg.name ? dbg.name : dbg.short_src );
- MemWrite( &item->zoneBegin.time, Profiler::GetTime() );
- MemWrite( &item->zoneBegin.srcloc, srcloc );
- TracyLfqCommit;
- return 0;
- #endif
- }
- static inline int LuaZoneBeginN( lua_State* L )
- {
- #if defined TRACY_HAS_CALLSTACK && defined TRACY_CALLSTACK
- return LuaZoneBeginNS( L );
- #else
- #ifdef TRACY_ON_DEMAND
- const auto zoneCnt = GetLuaZoneState().counter++;
- if( zoneCnt != 0 && !GetLuaZoneState().active ) return 0;
- GetLuaZoneState().active = GetProfiler().IsConnected();
- if( !GetLuaZoneState().active ) return 0;
- #endif
- TracyLfqPrepare( QueueType::ZoneBeginAllocSrcLoc );
- lua_Debug dbg;
- lua_getstack( L, 1, &dbg );
- lua_getinfo( L, "Snl", &dbg );
- size_t nsz;
- const auto name = lua_tolstring( L, 1, &nsz );
- const auto srcloc = Profiler::AllocSourceLocation( dbg.currentline, dbg.source, dbg.name ? dbg.name : dbg.short_src, name, nsz );
- MemWrite( &item->zoneBegin.time, Profiler::GetTime() );
- MemWrite( &item->zoneBegin.srcloc, srcloc );
- TracyLfqCommit;
- return 0;
- #endif
- }
- static inline int LuaZoneEnd( lua_State* L )
- {
- #ifdef TRACY_ON_DEMAND
- assert( GetLuaZoneState().counter != 0 );
- GetLuaZoneState().counter--;
- if( !GetLuaZoneState().active ) return 0;
- if( !GetProfiler().IsConnected() )
- {
- GetLuaZoneState().active = false;
- return 0;
- }
- #endif
- TracyLfqPrepare( QueueType::ZoneEnd );
- MemWrite( &item->zoneEnd.time, Profiler::GetTime() );
- TracyLfqCommit;
- return 0;
- }
- static inline int LuaZoneText( lua_State* L )
- {
- #ifdef TRACY_ON_DEMAND
- if( !GetLuaZoneState().active ) return 0;
- if( !GetProfiler().IsConnected() )
- {
- GetLuaZoneState().active = false;
- return 0;
- }
- #endif
- auto txt = lua_tostring( L, 1 );
- const auto size = strlen( txt );
- assert( size < std::numeric_limits<uint16_t>::max() );
- auto ptr = (char*)tracy_malloc( size );
- memcpy( ptr, txt, size );
- TracyLfqPrepare( QueueType::ZoneText );
- MemWrite( &item->zoneTextFat.text, (uint64_t)ptr );
- MemWrite( &item->zoneTextFat.size, (uint16_t)size );
- TracyLfqCommit;
- return 0;
- }
- static inline int LuaZoneName( lua_State* L )
- {
- #ifdef TRACY_ON_DEMAND
- if( !GetLuaZoneState().active ) return 0;
- if( !GetProfiler().IsConnected() )
- {
- GetLuaZoneState().active = false;
- return 0;
- }
- #endif
- auto txt = lua_tostring( L, 1 );
- const auto size = strlen( txt );
- assert( size < std::numeric_limits<uint16_t>::max() );
- auto ptr = (char*)tracy_malloc( size );
- memcpy( ptr, txt, size );
- TracyLfqPrepare( QueueType::ZoneName );
- MemWrite( &item->zoneTextFat.text, (uint64_t)ptr );
- MemWrite( &item->zoneTextFat.size, (uint16_t)size );
- TracyLfqCommit;
- return 0;
- }
- static inline int LuaMessage( lua_State* L )
- {
- #ifdef TRACY_ON_DEMAND
- if( !GetProfiler().IsConnected() ) return 0;
- #endif
- auto txt = lua_tostring( L, 1 );
- const auto size = strlen( txt );
- assert( size < std::numeric_limits<uint16_t>::max() );
- TracyLfqPrepare( QueueType::Message );
- auto ptr = (char*)tracy_malloc( size );
- memcpy( ptr, txt, size );
- MemWrite( &item->messageFat.time, Profiler::GetTime() );
- MemWrite( &item->messageFat.text, (uint64_t)ptr );
- MemWrite( &item->messageFat.size, (uint16_t)size );
- TracyLfqCommit;
- 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::LuaZoneBeginN );
- lua_setfield( L, -2, "ZoneBeginN" );
- #ifdef TRACY_HAS_CALLSTACK
- lua_pushcfunction( L, detail::LuaZoneBeginS );
- lua_setfield( L, -2, "ZoneBeginS" );
- lua_pushcfunction( L, detail::LuaZoneBeginNS );
- lua_setfield( L, -2, "ZoneBeginNS" );
- #else
- lua_pushcfunction( L, detail::LuaZoneBegin );
- lua_setfield( L, -2, "ZoneBeginS" );
- lua_pushcfunction( L, detail::LuaZoneBeginN );
- lua_setfield( L, -2, "ZoneBeginNS" );
- #endif
- lua_pushcfunction( L, detail::LuaZoneEnd );
- lua_setfield( L, -2, "ZoneEnd" );
- lua_pushcfunction( L, detail::LuaZoneText );
- lua_setfield( L, -2, "ZoneText" );
- lua_pushcfunction( L, detail::LuaZoneName );
- lua_setfield( L, -2, "ZoneName" );
- lua_pushcfunction( L, detail::LuaMessage );
- lua_setfield( L, -2, "Message" );
- lua_setglobal( L, "tracy" );
- }
- static inline void LuaRemove( char* script ) {}
- }
- #endif
- #endif
|