diff --git a/capture/src/capture.cpp b/capture/src/capture.cpp index 101c3d9d..eb6d8c7e 100644 --- a/capture/src/capture.cpp +++ b/capture/src/capture.cpp @@ -3,7 +3,9 @@ #endif #include +#include #include +#include #include #include @@ -13,6 +15,88 @@ #include "../../server/TracyWorker.hpp" #include "getopt.h" +static const char* TimeToString( int64_t ns ) +{ + enum { Pool = 8 }; + static char bufpool[Pool][64]; + static int bufsel = 0; + char* buf = bufpool[bufsel]; + bufsel = ( bufsel + 1 ) % Pool; + + const char* sign = ""; + if( ns < 0 ) + { + sign = "-"; + ns = -ns; + } + + if( ns < 1000 ) + { + sprintf( buf, "%s%" PRIi64 " ns", sign, ns ); + } + else if( ns < 1000ll * 1000 ) + { + sprintf( buf, "%s%.2f us", sign, ns / 1000. ); + } + else if( ns < 1000ll * 1000 * 1000 ) + { + sprintf( buf, "%s%.2f ms", sign, ns / ( 1000. * 1000. ) ); + } + else if( ns < 1000ll * 1000 * 1000 * 60 ) + { + sprintf( buf, "%s%.2f s", sign, ns / ( 1000. * 1000. * 1000. ) ); + } + else + { + const auto m = int64_t( ns / ( 1000ll * 1000 * 1000 * 60 ) ); + const auto s = int64_t( ns - m * ( 1000ll * 1000 * 1000 * 60 ) ); + sprintf( buf, "%s%" PRIi64 ":%04.1f", sign, m, s / ( 1000. * 1000. * 1000. ) ); + } + return buf; +} + +static const char* RealToString( double val, bool separator ) +{ + enum { Pool = 8 }; + static char bufpool[Pool][64]; + static int bufsel = 0; + char* buf = bufpool[bufsel]; + bufsel = ( bufsel + 1 ) % Pool; + + sprintf( buf, "%f", val ); + auto ptr = buf; + if( *ptr == '-' ) ptr++; + + const auto vbegin = ptr; + + if( separator ) + { + while( *ptr != '\0' && *ptr != ',' && *ptr != '.' ) ptr++; + auto end = ptr; + while( *end != '\0' ) end++; + auto sz = end - ptr; + + while( ptr - vbegin > 3 ) + { + ptr -= 3; + memmove( ptr+1, ptr, sz ); + *ptr = ','; + sz += 4; + } + } + + while( *ptr != '\0' && *ptr != ',' && *ptr != '.' ) ptr++; + + if( *ptr == '\0' ) return buf; + while( *ptr != '\0' ) ptr++; + ptr--; + while( *ptr == '0' && *ptr != ',' && *ptr != '.' ) ptr--; + if( *ptr != '.' && *ptr != ',' ) ptr++; + *ptr = '\0'; + return buf; +} + + void Usage() { printf( "Usage: capture -a address -o output.tracy\n" ); @@ -55,7 +139,7 @@ int main( int argc, char** argv ) fflush( stdout ); tracy::Worker worker( address ); while( !worker.HasData() ) std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); - printf( "\n" ); + printf( "\nQueue delay: %s\nTimer resolution: %s\n", TimeToString( worker.GetDelay() ), TimeToString( worker.GetResolution() ) ); auto& lock = worker.GetMbpsDataLock(); @@ -80,7 +164,7 @@ int main( int argc, char** argv ) std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); } - printf( "\nSaving trace..." ); + printf( "\nFrames: %" PRIu64 "\nTime span: %s\nZones: %s\nSaving trace...", worker.GetFrameCount(), TimeToString( worker.GetLastTime() - worker.GetFrameBegin( 0 ) ), RealToString( worker.GetZoneCount(), true ) ); fflush( stdout ); auto f = tracy::FileWrite::Open( output ); if( f )