diff --git a/server/TracyVersion.hpp b/server/TracyVersion.hpp index 65dd2ea5..d7d900db 100644 --- a/server/TracyVersion.hpp +++ b/server/TracyVersion.hpp @@ -7,7 +7,7 @@ namespace Version { enum { Major = 0 }; enum { Minor = 8 }; -enum { Patch = 3 }; +enum { Patch = 4 }; } } diff --git a/server/TracyView_Utility.cpp b/server/TracyView_Utility.cpp index ca603b3e..f9f7345b 100644 --- a/server/TracyView_Utility.cpp +++ b/server/TracyView_Utility.cpp @@ -813,6 +813,13 @@ const char* View::GetFrameSetName( const FrameData& fd, const Worker& worker ) { return "Frames"; } + else if( fd.name >> 63 != 0 ) + { + char* buf = bufpool[bufsel]; + bufsel = ( bufsel + 1 ) % Pool; + sprintf( buf, "[%" PRIu32 "] Vsync", uint32_t( fd.name ) ); + return buf; + } else { return worker.GetString( fd.name ); diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index 112aa807..075eefe6 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -4675,6 +4675,9 @@ bool Worker::Process( const QueueItem& ev ) case QueueType::FrameMarkMsgEnd: ProcessFrameMarkEnd( ev.frameMark ); break; + case QueueType::FrameVsync: + ProcessFrameVsync( ev.frameVsync ); + break; case QueueType::FrameImage: ProcessFrameImage( ev.frameImage ); break; @@ -5310,6 +5313,38 @@ void Worker::ProcessFrameMarkEnd( const QueueFrameMark& ev ) #endif } +void Worker::ProcessFrameVsync( const QueueFrameVsync& ev ) +{ + auto it = m_vsyncFrameMap.find( ev.id ); + if( it == m_vsyncFrameMap.end() ) + { + auto fd = m_slab.AllocInit(); + // Hackfix workaround to maintain backwards compatibility. + // Frame name pointers won't be in kernel space. Exploit that to store custom IDs. + fd->name = uint64_t( m_vsyncFrameMap.size() ) | 0x8000000000000000; + fd->continuous = 1; + m_data.frames.AddExternal( fd ); + it = m_vsyncFrameMap.emplace( ev.id, fd ).first; + } + auto fd = it->second; + assert( fd->continuous == 1 ); + const auto time = TscTime( ev.time ); + assert( fd->frames.empty() || fd->frames.back().start <= time ); + fd->frames.push_back( FrameEvent{ time, -1, -1 } ); + if( m_data.lastTime < time ) m_data.lastTime = time; + +#ifndef TRACY_NO_STATISTICS + const auto timeSpan = GetFrameTime( *fd, fd->frames.size() - 1 ); + if( timeSpan > 0 ) + { + fd->min = std::min( fd->min, timeSpan ); + fd->max = std::max( fd->max, timeSpan ); + fd->total += timeSpan; + fd->sumSq += double( timeSpan ) * timeSpan; + } +#endif +} + void Worker::ProcessFrameImage( const QueueFrameImage& ev ) { assert( m_pendingFrameImageData.image != nullptr ); diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index 79803a70..185a16b3 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -683,6 +683,7 @@ private: tracy_force_inline void ProcessFrameMark( const QueueFrameMark& ev ); tracy_force_inline void ProcessFrameMarkStart( const QueueFrameMark& ev ); tracy_force_inline void ProcessFrameMarkEnd( const QueueFrameMark& ev ); + tracy_force_inline void ProcessFrameVsync( const QueueFrameVsync& ev ); tracy_force_inline void ProcessFrameImage( const QueueFrameImage& ev ); tracy_force_inline void ProcessZoneText(); tracy_force_inline void ProcessZoneName(); @@ -983,6 +984,7 @@ private: Vector m_sourceLocationQueue; unordered_flat_map m_sourceLocationShrink; unordered_flat_map m_threadMap; + unordered_flat_map m_vsyncFrameMap; FrameImagePending m_pendingFrameImageData = {}; unordered_flat_map m_pendingSymbols; unordered_flat_set m_pendingFileStrings;