2017-09-12 23:33:50 +00:00
|
|
|
#ifndef __TRACYVIEW_HPP__
|
|
|
|
#define __TRACYVIEW_HPP__
|
|
|
|
|
|
|
|
#include <atomic>
|
2018-04-02 00:19:46 +00:00
|
|
|
#include <functional>
|
2017-10-24 20:30:43 +00:00
|
|
|
#include <map>
|
2017-09-12 23:33:50 +00:00
|
|
|
#include <string>
|
|
|
|
#include <thread>
|
2017-09-14 00:00:13 +00:00
|
|
|
#include <vector>
|
|
|
|
|
2018-04-01 16:59:55 +00:00
|
|
|
#include "../common/tracy_benaphore.h"
|
2017-09-15 18:17:39 +00:00
|
|
|
#include "TracyVector.hpp"
|
2018-02-13 13:57:47 +00:00
|
|
|
#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
|
|
|
|
2017-09-23 22:07:06 +00:00
|
|
|
struct ImVec2;
|
|
|
|
|
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;
|
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;
|
|
|
|
};
|
|
|
|
|
2018-03-04 21:21:35 +00:00
|
|
|
struct Region
|
|
|
|
{
|
|
|
|
bool active = false;
|
|
|
|
int64_t start;
|
|
|
|
int64_t end;
|
|
|
|
};
|
|
|
|
|
2017-09-12 23:33:50 +00:00
|
|
|
public:
|
|
|
|
View() : View( "127.0.0.1" ) {}
|
|
|
|
View( const char* addr );
|
2017-09-30 14:58:02 +00:00
|
|
|
View( FileRead& f );
|
2017-09-12 23:33:50 +00:00
|
|
|
~View();
|
|
|
|
|
2017-09-15 00:30:22 +00:00
|
|
|
static void Draw();
|
2017-09-13 00:08:35 +00:00
|
|
|
|
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
|
|
|
|
};
|
|
|
|
|
|
|
|
const char* ShortenNamespace( const char* name ) const;
|
|
|
|
|
2018-01-17 11:49:50 +00:00
|
|
|
void DrawHelpMarker( const char* desc ) const;
|
|
|
|
|
2017-11-25 14:45:16 +00:00
|
|
|
void DrawTextContrast( ImDrawList* draw, const ImVec2& pos, uint32_t color, const char* text );
|
|
|
|
|
2017-09-15 00:30:22 +00:00
|
|
|
void DrawImpl();
|
2017-09-30 12:37:21 +00:00
|
|
|
void DrawConnection();
|
2017-09-18 00:37:25 +00:00
|
|
|
void DrawFrames();
|
2017-10-13 13:26:18 +00:00
|
|
|
bool DrawZoneFrames();
|
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 );
|
2017-11-13 23:48:26 +00:00
|
|
|
int DrawGpuZoneLevel( const Vector<GpuEvent*>& vec, bool hover, double pxns, const ImVec2& wpos, int offset, int depth, uint64_t thread );
|
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 );
|
2017-10-18 20:29:59 +00:00
|
|
|
void DrawPlotPoint( const ImVec2& wpos, float x, float y, int offset, uint32_t color, bool hover, bool hasPrev, double val, double prev, bool merged );
|
2017-10-13 11:32:23 +00:00
|
|
|
void DrawOptions();
|
2017-10-14 12:36:30 +00:00
|
|
|
void DrawMessages();
|
2018-01-17 11:49:50 +00:00
|
|
|
void DrawFindZone();
|
2018-03-24 13:40:48 +00:00
|
|
|
void DrawStatistics();
|
2018-04-01 18:34:21 +00:00
|
|
|
void DrawMemory();
|
2017-09-15 00:30:22 +00:00
|
|
|
|
2018-04-02 00:19:46 +00:00
|
|
|
template<class T>
|
2018-04-03 12:17:51 +00:00
|
|
|
void ListMemData( T ptr, T end, std::function<const MemEvent*(T&)> DrawAddress );
|
2018-04-02 00:19:46 +00:00
|
|
|
|
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 );
|
2017-11-27 21:12:26 +00:00
|
|
|
void ZoomToRange( int64_t start, int64_t end );
|
|
|
|
|
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 );
|
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;
|
2018-03-18 15:38:42 +00:00
|
|
|
uint64_t GetZoneThread( const ZoneEvent& zone ) const;
|
2018-03-19 15:11:37 +00:00
|
|
|
uint64_t GetZoneThread( const GpuEvent& zone ) const;
|
2018-04-01 19:47:08 +00:00
|
|
|
const ZoneEvent* FindZoneAtTime( uint64_t thread, int64_t time ) const;
|
2017-09-29 19:57:00 +00:00
|
|
|
|
2018-03-18 11:55:54 +00:00
|
|
|
#ifndef TRACY_NO_STATISTICS
|
2018-01-17 11:49:50 +00:00
|
|
|
void FindZones();
|
2018-03-18 11:55:54 +00:00
|
|
|
#endif
|
2018-01-17 11:49:50 +00:00
|
|
|
|
2018-04-03 17:17:32 +00:00
|
|
|
Vector<int8_t> GetMemoryPages() const;
|
2018-04-02 16:14:59 +00:00
|
|
|
|
2018-03-20 14:33:38 +00:00
|
|
|
flat_hash_map<const void*, bool, nohash<const void*>> m_visible;
|
|
|
|
flat_hash_map<const void*, bool, nohash<const void*>> m_showFull;
|
|
|
|
|
|
|
|
tracy_force_inline bool& Visible( const void* ptr )
|
2018-02-13 13:57:47 +00:00
|
|
|
{
|
2018-03-20 14:33:38 +00:00
|
|
|
auto it = m_visible.find( ptr );
|
|
|
|
if( it == m_visible.end() )
|
2018-02-13 13:57:47 +00:00
|
|
|
{
|
2018-03-20 14:33:38 +00:00
|
|
|
it = m_visible.emplace( ptr, true ).first;
|
2018-02-13 13:57:47 +00:00
|
|
|
}
|
2018-03-20 14:33:38 +00:00
|
|
|
return it->second;
|
2018-02-13 13:57:47 +00:00
|
|
|
}
|
2017-09-30 14:20:08 +00:00
|
|
|
|
2018-03-20 14:33:38 +00:00
|
|
|
tracy_force_inline bool& ShowFull( const void* ptr )
|
2018-02-13 13:57:47 +00:00
|
|
|
{
|
2018-03-20 14:33:38 +00:00
|
|
|
auto it = m_showFull.find( ptr );
|
|
|
|
if( it == m_showFull.end() )
|
2018-02-13 13:57:47 +00:00
|
|
|
{
|
2018-03-20 14:33:38 +00:00
|
|
|
it = m_showFull.emplace( ptr, true ).first;
|
2018-02-13 13:57:47 +00:00
|
|
|
}
|
2018-03-20 14:33:38 +00:00
|
|
|
return it->second;
|
2018-02-13 13:57:47 +00:00
|
|
|
}
|
2017-09-12 23:33:50 +00:00
|
|
|
|
2018-02-13 13:57:47 +00:00
|
|
|
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;
|
2017-12-09 19:05:34 +00:00
|
|
|
int64_t m_lastTime;
|
2017-09-24 14:10:28 +00:00
|
|
|
|
2017-10-01 17:58:53 +00:00
|
|
|
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;
|
2017-10-08 21:03:38 +00:00
|
|
|
LockHighlight m_lockHighlight;
|
2017-10-14 13:47:06 +00:00
|
|
|
const MessageData* m_msgHighlight;
|
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;
|
2017-10-13 11:32:23 +00:00
|
|
|
|
2018-03-04 21:21:35 +00:00
|
|
|
Region m_highlight;
|
2017-10-15 14:42:56 +00:00
|
|
|
|
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;
|
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;
|
2018-03-24 16:28:10 +00:00
|
|
|
int m_statSort;
|
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;
|
2017-10-22 11:56:05 +00:00
|
|
|
|
2018-01-17 11:49:50 +00:00
|
|
|
struct {
|
2018-03-20 13:37:58 +00:00
|
|
|
enum : uint64_t { Unselected = std::numeric_limits<uint64_t>::max() - 1 };
|
|
|
|
|
2018-04-01 19:24:30 +00:00
|
|
|
bool show = false;
|
2018-03-18 15:07:07 +00:00
|
|
|
std::vector<int32_t> match;
|
2018-03-18 20:15:31 +00:00
|
|
|
std::map<uint64_t, Vector<ZoneEvent*>> threads;
|
2018-03-18 15:41:58 +00:00
|
|
|
size_t processed;
|
2018-03-18 15:07:07 +00:00
|
|
|
int selMatch = 0;
|
2018-03-20 13:37:58 +00:00
|
|
|
uint64_t selThread = Unselected;
|
2018-04-01 19:24:30 +00:00
|
|
|
char pattern[1024] = {};
|
2018-02-16 12:28:40 +00:00
|
|
|
bool logVal = false;
|
2018-02-16 14:34:22 +00:00
|
|
|
bool logTime = false;
|
2018-03-05 19:15:18 +00:00
|
|
|
bool cumulateTime = false;
|
2018-03-19 15:01:36 +00:00
|
|
|
bool showThreads = true;
|
2018-03-20 16:19:48 +00:00
|
|
|
bool sortByCounts = false;
|
2018-03-04 21:52:36 +00:00
|
|
|
Region highlight;
|
|
|
|
|
|
|
|
void Reset()
|
|
|
|
{
|
2018-03-18 15:41:58 +00:00
|
|
|
ResetThreads();
|
2018-03-04 21:52:36 +00:00
|
|
|
match.clear();
|
2018-03-18 15:07:07 +00:00
|
|
|
selMatch = 0;
|
2018-03-20 13:37:58 +00:00
|
|
|
selThread = Unselected;
|
2018-03-04 21:52:36 +00:00
|
|
|
highlight.active = false;
|
|
|
|
}
|
2018-03-18 15:41:58 +00:00
|
|
|
|
|
|
|
void ResetThreads()
|
|
|
|
{
|
|
|
|
threads.clear();
|
|
|
|
processed = 0;
|
|
|
|
}
|
2018-04-05 17:30:32 +00:00
|
|
|
|
|
|
|
void ShowZone( int32_t srcloc, const char* name )
|
|
|
|
{
|
|
|
|
show = true;
|
|
|
|
Reset();
|
|
|
|
match.emplace_back( srcloc );
|
|
|
|
strcpy( pattern, name );
|
|
|
|
}
|
2018-01-17 11:49:50 +00:00
|
|
|
} m_findZone;
|
2018-04-01 19:24:30 +00:00
|
|
|
|
|
|
|
struct {
|
|
|
|
bool show = false;
|
|
|
|
char pattern[1024] = {};
|
|
|
|
uint64_t ptrFind = 0;
|
2018-04-02 14:07:33 +00:00
|
|
|
bool restrictTime = false;
|
2018-04-01 19:24:30 +00:00
|
|
|
} m_memInfo;
|
2017-09-12 23:33:50 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|