tracy/server/TracyView.hpp

363 lines
11 KiB
C++
Raw Normal View History

2017-09-12 23:33:50 +00:00
#ifndef __TRACYVIEW_HPP__
#define __TRACYVIEW_HPP__
#include <atomic>
#include <functional>
#include <map>
2018-08-17 12:44:41 +00:00
#include <memory>
2017-09-12 23:33:50 +00:00
#include <string>
#include <thread>
2017-09-14 00:00:13 +00:00
#include <vector>
#include "TracyBuzzAnim.hpp"
#include "TracyDecayValue.hpp"
2017-09-15 18:17:39 +00:00
#include "TracyVector.hpp"
#include "TracyWorker.hpp"
2017-11-15 22:15:59 +00:00
#include "tracy_flat_hash_map.hpp"
2017-09-12 23:33:50 +00:00
struct ImVec2;
2018-08-17 13:18:09 +00:00
struct ImFont;
2017-09-12 23:33:50 +00:00
namespace tracy
{
2017-09-13 21:40:28 +00:00
struct QueueItem;
2017-09-30 14:58:02 +00:00
class FileRead;
2018-08-17 12:44:41 +00:00
class TextEditor;
2017-09-13 21:40:28 +00:00
2017-09-12 23:33:50 +00:00
class View
{
2017-11-27 21:41:30 +00:00
struct Animation
{
bool active = false;
int64_t start0, start1;
int64_t end0, end1;
double progress;
double lenMod;
};
struct Region
{
bool active = false;
int64_t start;
int64_t end;
};
2017-09-12 23:33:50 +00:00
public:
using SetTitleCallback = void(*)( const char* );
View( ImFont* fixedWidth = nullptr, SetTitleCallback stcb = nullptr ) : View( "127.0.0.1", fixedWidth, stcb ) {}
View( const char* addr, ImFont* fixedWidth = nullptr, SetTitleCallback stcb = nullptr );
View( FileRead& f, ImFont* fixedWidth = nullptr, SetTitleCallback stcb = nullptr );
2017-09-12 23:33:50 +00:00
~View();
2018-04-29 23:16:08 +00:00
static bool Draw();
void NotifyRootWindowSize( float w, float h ) { m_rootWidth = w; m_rootHeight = h; }
2018-08-18 12:26:10 +00:00
void SetTextEditorFile( const char* fileName, int line );
2017-09-12 23:33:50 +00:00
private:
2017-10-22 11:56:05 +00:00
enum class Namespace : uint8_t
{
Full,
Mid,
Short
};
2018-08-17 12:44:41 +00:00
void InitTextEditor();
2017-10-22 11:56:05 +00:00
const char* ShortenNamespace( const char* name ) const;
void DrawHelpMarker( const char* desc ) const;
void DrawTextContrast( ImDrawList* draw, const ImVec2& pos, uint32_t color, const char* text );
2018-04-29 23:16:08 +00:00
bool DrawImpl();
2017-09-30 12:37:21 +00:00
void DrawConnection();
2017-09-18 00:37:25 +00:00
void DrawFrames();
2018-08-04 19:10:03 +00:00
bool DrawZoneFramesHeader();
bool DrawZoneFrames( const FrameData& frames );
2017-09-20 22:57:26 +00:00
void DrawZones();
2018-04-20 21:19:04 +00:00
int DispatchZoneLevel( const Vector<ZoneEvent*>& vec, bool hover, double pxns, const ImVec2& wpos, int offset, int depth, float yMin, float yMax );
int DrawZoneLevel( const Vector<ZoneEvent*>& vec, bool hover, double pxns, const ImVec2& wpos, int offset, int depth, float yMin, float yMax );
int SkipZoneLevel( const Vector<ZoneEvent*>& vec, bool hover, double pxns, const ImVec2& wpos, int offset, int depth, float yMin, float yMax );
2018-06-27 23:12:25 +00:00
int DispatchGpuZoneLevel( const Vector<GpuEvent*>& vec, bool hover, double pxns, const ImVec2& wpos, int offset, int depth, uint64_t thread, float yMin, float yMax, int64_t begin, int drift );
int DrawGpuZoneLevel( const Vector<GpuEvent*>& vec, bool hover, double pxns, const ImVec2& wpos, int offset, int depth, uint64_t thread, float yMin, float yMax, int64_t begin, int drift );
int SkipGpuZoneLevel( const Vector<GpuEvent*>& vec, bool hover, double pxns, const ImVec2& wpos, int offset, int depth, uint64_t thread, float yMin, float yMax, int64_t begin, int drift );
2018-04-20 20:53:15 +00:00
int DrawLocks( uint64_t tid, bool hover, double pxns, const ImVec2& wpos, int offset, LockHighlight& highlight, float yMin, float yMax );
2018-04-20 21:00:26 +00:00
int DrawPlots( int offset, double pxns, const ImVec2& wpos, bool hover, float yMin, float yMax );
2018-06-28 22:38:56 +00:00
void DrawPlotPoint( const ImVec2& wpos, float x, float y, int offset, uint32_t color, bool hover, bool hasPrev, const PlotItem* item, double prev, bool merged, PlotType type, float PlotHeight );
void DrawPlotPoint( const ImVec2& wpos, float x, float y, int offset, uint32_t color, bool hover, bool hasPrev, double val, double prev, bool merged, float PlotHeight );
2017-10-13 11:32:23 +00:00
void DrawOptions();
2017-10-14 12:36:30 +00:00
void DrawMessages();
void DrawFindZone();
2018-03-24 13:40:48 +00:00
void DrawStatistics();
void DrawMemory();
2018-04-21 22:52:33 +00:00
void DrawCompare();
void DrawCallstackWindow();
2018-07-17 21:03:03 +00:00
void DrawMemoryAllocWindow();
2018-08-08 17:25:13 +00:00
void DrawInfo();
void DrawTextEditor();
2017-09-15 00:30:22 +00:00
template<class T>
void ListMemData( T ptr, T end, std::function<void(T&)> DrawAddress, const char* id = nullptr );
std::vector<CallstackFrameTree> GetCallstackFrameTree( const MemData& mem ) const;
void DrawFrameTreeLevel( std::vector<CallstackFrameTree>& tree, int& idx );
2017-11-12 00:25:44 +00:00
void DrawInfoWindow();
void DrawZoneInfoWindow();
void DrawGpuInfoWindow();
2017-10-12 20:27:17 +00:00
void HandleZoneViewMouse( int64_t timespan, const ImVec2& wpos, float w, double& pxns );
2017-10-22 13:37:24 +00:00
uint32_t GetZoneColor( const ZoneEvent& ev );
2017-11-11 21:56:05 +00:00
uint32_t GetZoneColor( const GpuEvent& ev );
2017-10-22 13:37:24 +00:00
uint32_t GetZoneHighlight( const ZoneEvent& ev, bool migration );
2017-11-11 21:56:05 +00:00
uint32_t GetZoneHighlight( const GpuEvent& ev );
2017-10-22 13:37:24 +00:00
float GetZoneThickness( const ZoneEvent& ev );
2017-11-11 21:56:05 +00:00
float GetZoneThickness( const GpuEvent& ev );
2017-10-01 17:31:22 +00:00
2017-10-22 13:37:24 +00:00
void ZoomToZone( const ZoneEvent& ev );
2017-11-11 21:56:05 +00:00
void ZoomToZone( const GpuEvent& ev );
void ZoomToRange( int64_t start, int64_t end );
void ZoomToPrevFrame();
void ZoomToNextFrame();
void CenterAtTime( int64_t t );
2018-05-02 17:23:46 +00:00
void ShowZoneInfo( const ZoneEvent& ev );
void ShowZoneInfo( const GpuEvent& ev, uint64_t thread );
2017-10-22 13:37:24 +00:00
void ZoneTooltip( const ZoneEvent& ev );
2017-11-11 21:56:05 +00:00
void ZoneTooltip( const GpuEvent& ev );
2018-06-19 20:19:33 +00:00
void CallstackTooltip( uint32_t idx );
2017-10-22 14:15:27 +00:00
const ZoneEvent* GetZoneParent( const ZoneEvent& zone ) const;
2017-11-12 00:25:44 +00:00
const GpuEvent* GetZoneParent( const GpuEvent& zone ) const;
uint64_t GetZoneThread( const ZoneEvent& zone ) const;
2018-03-19 15:11:37 +00:00
uint64_t GetZoneThread( const GpuEvent& zone ) const;
const GpuCtxData* GetZoneCtx( const GpuEvent& zone ) const;
const ZoneEvent* FindZoneAtTime( uint64_t thread, int64_t time ) const;
2018-08-04 19:19:24 +00:00
const char* GetFrameText( const FrameData& fd, int i, uint64_t ftime, uint64_t offset ) const;
2017-09-29 19:57:00 +00:00
#ifndef TRACY_NO_STATISTICS
void FindZones();
2018-04-21 22:52:33 +00:00
void FindZonesCompare();
#endif
std::pair<int8_t*, size_t> GetMemoryPages() const;
const char* GetPlotName( const PlotData* plot ) const;
2018-04-02 16:14:59 +00:00
2018-07-17 20:53:38 +00:00
void SmallCallstackButton( const char* name, uint32_t callstack, int& idx );
flat_hash_map<const void*, bool, nohash<const void*>> m_visible;
2018-08-18 17:57:36 +00:00
flat_hash_map<uint64_t, bool, nohash<uint64_t>> m_visibleMsgThread;
flat_hash_map<const void*, bool, nohash<const void*>> m_showFull;
2018-06-27 23:08:08 +00:00
flat_hash_map<const void*, int, nohash<const void*>> m_gpuDrift;
tracy_force_inline bool& Visible( const void* ptr )
{
auto it = m_visible.find( ptr );
if( it == m_visible.end() )
{
it = m_visible.emplace( ptr, true ).first;
}
return it->second;
}
2017-09-30 14:20:08 +00:00
2018-08-18 17:57:36 +00:00
tracy_force_inline bool& VisibleMsgThread( uint64_t thread )
{
auto it = m_visibleMsgThread.find( thread );
if( it == m_visibleMsgThread.end() )
{
it = m_visibleMsgThread.emplace( thread, true ).first;
}
return it->second;
}
tracy_force_inline bool& ShowFull( const void* ptr )
{
auto it = m_showFull.find( ptr );
if( it == m_showFull.end() )
{
it = m_showFull.emplace( ptr, true ).first;
}
return it->second;
}
2017-09-12 23:33:50 +00:00
2018-06-27 23:08:08 +00:00
tracy_force_inline int& GpuDrift( const void* ptr )
{
auto it = m_gpuDrift.find( ptr );
if( it == m_gpuDrift.end() )
{
it = m_gpuDrift.emplace( ptr, 0 ).first;
}
return it->second;
}
Worker m_worker;
2017-09-30 14:58:02 +00:00
bool m_staticView;
2017-09-12 23:54:22 +00:00
2017-09-18 00:37:25 +00:00
int m_frameScale;
2017-09-18 22:26:40 +00:00
bool m_pause;
int m_frameStart;
2017-09-20 19:21:21 +00:00
2017-09-20 23:13:23 +00:00
int64_t m_zvStart;
int64_t m_zvEnd;
int64_t m_lastTime;
int8_t m_lastCpu;
2017-10-28 19:50:06 +00:00
int m_zvHeight;
int m_zvScroll;
2017-10-12 20:27:17 +00:00
2017-10-22 13:37:24 +00:00
const ZoneEvent* m_zoneInfoWindow;
const ZoneEvent* m_zoneHighlight;
DecayValue<uint64_t> m_zoneSrcLocHighlight;
2017-10-08 21:03:38 +00:00
LockHighlight m_lockHighlight;
DecayValue<const MessageData*> m_msgHighlight;
const MessageData* m_msgToFocus;
2017-11-12 00:25:44 +00:00
const GpuEvent* m_gpuInfoWindow;
2017-11-12 00:28:07 +00:00
const GpuEvent* m_gpuHighlight;
2017-11-13 23:48:26 +00:00
uint64_t m_gpuInfoWindowThread;
uint32_t m_callstackInfoWindow;
int64_t m_memoryAllocInfoWindow;
int64_t m_memoryAllocHover;
int m_memoryAllocHoverWait;
2018-08-04 17:47:09 +00:00
const FrameData* m_frames;
2017-10-13 11:32:23 +00:00
Region m_highlight;
Region m_highlightZoom;
2017-11-11 22:13:54 +00:00
uint64_t m_gpuThread;
int64_t m_gpuStart;
int64_t m_gpuEnd;
2017-10-13 11:32:23 +00:00
bool m_showOptions;
2017-10-14 12:36:30 +00:00
bool m_showMessages;
2018-03-24 13:40:48 +00:00
bool m_showStatistics;
2018-08-08 17:25:13 +00:00
bool m_showInfo;
2017-11-11 21:56:05 +00:00
bool m_drawGpuZones;
2017-10-13 11:32:23 +00:00
bool m_drawZones;
bool m_drawLocks;
2017-10-13 12:54:32 +00:00
bool m_drawPlots;
2017-10-22 11:32:27 +00:00
bool m_onlyContendedLocks;
int m_statSort;
bool m_statSelf;
bool m_showCallstackFrameAddress;
2017-10-18 16:48:51 +00:00
2017-10-22 11:56:05 +00:00
Namespace m_namespace;
2017-11-27 21:41:30 +00:00
Animation m_zoomAnim;
BuzzAnim<int> m_callstackBuzzAnim;
BuzzAnim<int> m_callstackTreeBuzzAnim;
2018-08-18 12:26:10 +00:00
BuzzAnim<const void*> m_zoneinfoBuzzAnim;
BuzzAnim<int> m_findZoneBuzzAnim;
2017-10-22 11:56:05 +00:00
2018-05-02 17:23:46 +00:00
Vector<const ZoneEvent*> m_zoneInfoStack;
Vector<const GpuEvent*> m_gpuInfoStack;
2018-08-17 12:44:41 +00:00
std::unique_ptr<TextEditor> m_textEditor;
2018-08-17 12:54:28 +00:00
const char* m_textEditorFile;
2018-08-17 13:18:09 +00:00
ImFont* m_textEditorFont;
2018-08-17 12:44:41 +00:00
float m_rootWidth, m_rootHeight;
SetTitleCallback m_stcb;
bool m_titleSet;
struct FindZone {
enum : uint64_t { Unselected = std::numeric_limits<uint64_t>::max() - 1 };
enum class GroupBy : int { Thread, UserText, Callstack };
2018-07-21 21:58:50 +00:00
enum class SortBy : int { Order, Count, Time };
2018-07-21 21:53:11 +00:00
struct Group
{
Vector<ZoneEvent*> zones;
int64_t time = 0;
};
2018-04-01 19:24:30 +00:00
bool show = false;
std::vector<int32_t> match;
2018-07-21 21:53:11 +00:00
std::map<uint64_t, Group> groups;
size_t processed;
int selMatch = 0;
uint64_t selGroup = Unselected;
2018-04-01 19:24:30 +00:00
char pattern[1024] = {};
bool logVal = false;
bool logTime = true;
2018-03-05 19:15:18 +00:00
bool cumulateTime = false;
GroupBy groupBy = GroupBy::Thread;
2018-07-21 21:58:50 +00:00
SortBy sortBy = SortBy::Order;
2018-03-04 21:52:36 +00:00
Region highlight;
2018-06-06 21:06:00 +00:00
int64_t numBins = -1;
std::unique_ptr<int64_t[]> bins, binTime, selBin;
2018-03-04 21:52:36 +00:00
void Reset()
{
ResetGroups();
2018-03-04 21:52:36 +00:00
match.clear();
selMatch = 0;
selGroup = Unselected;
2018-03-04 21:52:36 +00:00
highlight.active = false;
}
void ResetGroups()
{
groups.clear();
processed = 0;
}
void ShowZone( int32_t srcloc, const char* name )
{
show = true;
Reset();
match.emplace_back( srcloc );
strcpy( pattern, name );
}
} m_findZone;
2018-04-01 19:24:30 +00:00
tracy_force_inline uint64_t GetSelectionTarget( const Worker::ZoneThreadData& ev, FindZone::GroupBy groupBy ) const;
2018-06-06 21:09:46 +00:00
struct CompVal
{
double v0;
double v1;
};
2018-04-21 22:52:33 +00:00
struct {
bool show = false;
std::unique_ptr<Worker> second;
std::thread loadThread;
2018-04-21 22:52:33 +00:00
int badVer = 0;
char pattern[1024] = {};
std::vector<int32_t> match[2];
int selMatch[2] = { 0, 0 };
bool logVal = false;
bool logTime = true;
bool cumulateTime = false;
bool normalize = false;
2018-06-06 21:09:46 +00:00
int64_t numBins = -1;
std::unique_ptr<CompVal[]> bins, binTime;
2018-04-21 22:52:33 +00:00
void Reset()
{
for( int i=0; i<2; i++ )
{
match[i].clear();
selMatch[i] = 0;
}
}
} m_compare;
2018-04-01 19:24:30 +00:00
struct {
bool show = false;
char pattern[1024] = {};
uint64_t ptrFind = 0;
bool restrictTime = false;
2018-04-01 19:24:30 +00:00
} m_memInfo;
2017-09-12 23:33:50 +00:00
};
}
#endif