diff --git a/profiler/src/profiler/TracyView_TraceInfo.cpp b/profiler/src/profiler/TracyView_TraceInfo.cpp index 39349fbd..9accf191 100644 --- a/profiler/src/profiler/TracyView_TraceInfo.cpp +++ b/profiler/src/profiler/TracyView_TraceInfo.cpp @@ -704,6 +704,7 @@ void View::DrawInfo() std::vector maxthreads( topology.size() ); float ptsz = 0; + float dtsz = 0; float ctsz = 0; float ttsz = 0; for( auto& package : topology ) @@ -715,20 +716,27 @@ void View::DrawInfo() ImGui::PopFont(); size_t mt = 0; - for( auto& core : package.second ) + for( auto& die : package.second ) { - sprintf( buf, ICON_FA_MICROCHIP "%" PRIu32, core.first ); - const auto csz = ImGui::CalcTextSize( buf ).x; - if( csz > ctsz ) ctsz = csz; + sprintf( buf, ICON_FA_DICE_D6 " Die %" PRIu32, die.first ); + const auto dsz = ImGui::CalcTextSize( buf ).x; + if( dsz > dtsz ) dtsz = dsz; - const auto tnum = core.second.size(); - if( tnum > mt ) mt = tnum; - - for( auto& thread : core.second ) + for( auto& core : die.second ) { - sprintf( buf, ICON_FA_SHUFFLE "%" PRIu32, thread ); - const auto tsz = ImGui::CalcTextSize( buf ).x; - if( tsz > ttsz ) ttsz = tsz; + sprintf( buf, ICON_FA_MICROCHIP "%" PRIu32, core.first ); + const auto csz = ImGui::CalcTextSize( buf ).x; + if( csz > ctsz ) ctsz = csz; + + const auto tnum = core.second.size(); + if( tnum > mt ) mt = tnum; + + for( auto& thread : core.second ) + { + sprintf( buf, ICON_FA_SHUFFLE "%" PRIu32, thread ); + const auto tsz = ImGui::CalcTextSize( buf ).x; + if( tsz > ttsz ) ttsz = tsz; + } } } maxthreads[package.first] = (int)mt; @@ -752,48 +760,60 @@ void View::DrawInfo() draw->AddText( dpos, 0xFFFFFFFF, buf ); dpos.y += ty; - const auto inCoreWidth = ( ttsz + margin ) * maxthreads[package->first]; - const auto coreWidth = inCoreWidth + 2 * margin; - const auto inCoreHeight = margin + 2 * small + ty; - const auto coreHeight = inCoreHeight + ty; - const auto cpl = std::max( 1, (int)floor( ( remainingWidth - 2 * margin ) / coreWidth ) ); - const auto cl = ( package->second.size() + cpl - 1 ) / cpl; - const auto pw = cpl * coreWidth + 2 * margin; - const auto ph = margin + cl * coreHeight; - if( pw > width ) width = pw; - - draw->AddRect( dpos, dpos + ImVec2( margin + coreWidth * std::min( cpl, package->second.size() ), ph ), 0xFFFFFFFF ); - - std::vectorsecond.begin())> csort; - csort.reserve( package->second.size() ); - for( auto it = package->second.begin(); it != package->second.end(); ++it ) csort.emplace_back( it ); - std::sort( csort.begin(), csort.end(), [] ( const auto& l, const auto& r ) { return l->first < r->first; } ); - auto cpos = dpos + ImVec2( margin, margin ); - int ll = cpl; - for( auto& core : csort ) + std::vectorsecond.begin())> dsort; + dsort.reserve( package->second.size() ); + for( auto it = package->second.begin(); it != package->second.end(); ++it ) dsort.emplace_back( it ); + std::sort( dsort.begin(), dsort.end(), [] ( const auto& l, const auto& r ) { return l->first < r->first; } ); + for( auto& die : dsort ) { - sprintf( buf, ICON_FA_MICROCHIP "%" PRIu32, core->first ); - draw->AddText( cpos, 0xFFFFFFFF, buf ); - draw->AddRect( cpos + ImVec2( 0, ty ), cpos + ImVec2( inCoreWidth + small, inCoreHeight + small ), 0xFFFFFFFF ); + dpos.y += small; + sprintf( buf, ICON_FA_DICE_D6 " Die %" PRIu32, die->first ); + draw->AddText( dpos, 0xFFFFFFFF, buf ); + dpos.y += ty; - for( int i=0; isecond.size(); i++ ) - { - sprintf( buf, ICON_FA_SHUFFLE "%" PRIu32, core->second[i] ); - draw->AddText( cpos + ImVec2( margin + i * ( margin + ttsz ), ty + small ), 0xFFFFFFFF, buf ); - } + const auto inCoreWidth = ( ttsz + margin ) * maxthreads[package->first]; + const auto coreWidth = inCoreWidth + 2 * margin; + const auto inCoreHeight = margin + 2 * small + ty; + const auto coreHeight = inCoreHeight + ty; + const auto cpl = std::max( 1, (int)floor( ( remainingWidth - 2 * margin ) / coreWidth ) ); + const auto cl = ( die->second.size() + cpl - 1 ) / cpl; + const auto pw = cpl * coreWidth + 2 * margin; + const auto ph = margin + cl * coreHeight; + if( pw > width ) width = pw; - if( --ll == 0 ) + draw->AddRect( dpos, dpos + ImVec2( margin + coreWidth * std::min( cpl, die->second.size() ), ph ), 0xFFFFFFFF ); + + std::vectorsecond.begin())> csort; + csort.reserve( die->second.size() ); + for( auto it = die->second.begin(); it != die->second.end(); ++it ) csort.emplace_back( it ); + std::sort( csort.begin(), csort.end(), [] ( const auto& l, const auto& r ) { return l->first < r->first; } ); + auto cpos = dpos + ImVec2( margin, margin ); + int ll = cpl; + for( auto& core : csort ) { - ll = cpl; - cpos.x -= (cpl-1) * coreWidth; - cpos.y += coreHeight; - } - else - { - cpos.x += coreWidth; + sprintf( buf, ICON_FA_MICROCHIP "%" PRIu32, core->first ); + draw->AddText( cpos, 0xFFFFFFFF, buf ); + draw->AddRect( cpos + ImVec2( 0, ty ), cpos + ImVec2( inCoreWidth + small, inCoreHeight + small ), 0xFFFFFFFF ); + + for( int i=0; isecond.size(); i++ ) + { + sprintf( buf, ICON_FA_SHUFFLE "%" PRIu32, core->second[i] ); + draw->AddText( cpos + ImVec2( margin + i * ( margin + ttsz ), ty + small ), 0xFFFFFFFF, buf ); + } + + if( --ll == 0 ) + { + ll = cpl; + cpos.x -= (cpl-1) * coreWidth; + cpos.y += coreHeight; + } + else + { + cpos.x += coreWidth; + } } + dpos.y += ph; } - dpos.y += ph; } ImGui::ItemSize( ImVec2( width, dpos.y - origy ) ); ImGui::TreePop(); diff --git a/public/common/TracyVersion.hpp b/public/common/TracyVersion.hpp index 0905ef94..12642d65 100644 --- a/public/common/TracyVersion.hpp +++ b/public/common/TracyVersion.hpp @@ -7,7 +7,7 @@ namespace Version { enum { Major = 0 }; enum { Minor = 11 }; -enum { Patch = 1 }; +enum { Patch = 2 }; } } diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index 5c297291..adec0672 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -643,22 +643,50 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks, bool allow uint32_t packageId; uint64_t psz; f.Read2( packageId, psz ); - auto& package = *m_data.cpuTopology.emplace( packageId, unordered_flat_map> {} ).first; + auto& package = *m_data.cpuTopology.emplace( packageId, unordered_flat_map>> {} ).first; package.second.reserve( psz ); for( uint64_t j=0; j {} ).first; - core.second.reserve( csz ); - for( uint64_t k=0; k= FileVersion( 0, 11, 2 ) ) { - uint32_t thread; - f.Read( thread ); - core.second.emplace_back( thread ); + uint32_t dieId; + uint64_t dsz; + f.Read2( dieId, dsz ); + auto& die = *package.second.emplace( dieId, unordered_flat_map> {} ).first; + die.second.reserve( dsz ); + for( uint64_t k=0; k {} ).first; + core.second.reserve( csz ); + for( uint64_t l=0; l> {} ).first; + uint32_t coreId; + uint64_t csz; + f.Read2( coreId, csz ); + auto& core = *die.second.emplace( coreId, std::vector {} ).first; + core.second.reserve( csz ); + for( uint64_t k=0; k> {} ).first; - auto core = package->second.find( ev.core ); - if( core == package->second.end() ) core = package->second.emplace( ev.core, std::vector {} ).first; + if( package == m_data.cpuTopology.end() ) package = m_data.cpuTopology.emplace( ev.package, unordered_flat_map>> {} ).first; + + auto die = package->second.find( ev.die ); + if( die == package->second.end() ) die = package->second.emplace( ev.die, unordered_flat_map> {} ).first; + + auto core = die->second.find( ev.core ); + if( core == die->second.end() ) core = die->second.emplace( ev.core, std::vector {} ).first; core->second.emplace_back( ev.thread ); assert( m_data.cpuTopologyMap.find( ev.thread ) == m_data.cpuTopologyMap.end() ); @@ -7699,14 +7731,20 @@ void Worker::Write( FileWrite& f, bool fiDict ) sz = package.second.size(); f.Write( &package.first, sizeof( package.first ) ); f.Write( &sz, sizeof( sz ) ); - for( auto& core : package.second ) + for( auto& die : package.second ) { - sz = core.second.size(); - f.Write( &core.first, sizeof( core.first ) ); + sz = die.second.size(); + f.Write( &die.first, sizeof( die.first ) ); f.Write( &sz, sizeof( sz ) ); - for( auto& thread : core.second ) + for( auto& core : die.second ) { - f.Write( &thread, sizeof( thread ) ); + sz = core.second.size(); + f.Write( &core.first, sizeof( core.first ) ); + f.Write( &sz, sizeof( sz ) ); + for( auto& thread : core.second ) + { + f.Write( &thread, sizeof( thread ) ); + } } } } diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index 0a4ca829..91ce5cda 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -392,7 +392,7 @@ private: bool ctxUsageReady = false; #endif - unordered_flat_map>> cpuTopology; + unordered_flat_map>>> cpuTopology; unordered_flat_map cpuTopologyMap; unordered_flat_map symbolCode;