2017-09-10 15:43:56 +00:00
|
|
|
#ifndef __TRACYPROFILER_HPP__
|
|
|
|
#define __TRACYPROFILER_HPP__
|
|
|
|
|
|
|
|
#include <atomic>
|
2017-09-25 22:42:09 +00:00
|
|
|
#include <chrono>
|
2017-09-10 18:08:42 +00:00
|
|
|
#include <stdint.h>
|
2017-09-10 15:43:56 +00:00
|
|
|
#include <thread>
|
|
|
|
|
2017-10-03 12:19:32 +00:00
|
|
|
#include "concurrentqueue.h"
|
2017-09-17 11:10:42 +00:00
|
|
|
#include "../common/tracy_lz4.hpp"
|
2017-09-13 20:56:08 +00:00
|
|
|
#include "../common/TracyQueue.hpp"
|
2017-09-10 18:09:14 +00:00
|
|
|
|
2017-09-25 22:42:09 +00:00
|
|
|
#if defined _MSC_VER || defined __CYGWIN__
|
|
|
|
# include <intrin.h>
|
|
|
|
#endif
|
|
|
|
|
2017-09-10 15:43:56 +00:00
|
|
|
namespace tracy
|
|
|
|
{
|
|
|
|
|
2017-09-14 17:07:56 +00:00
|
|
|
class Socket;
|
|
|
|
|
2017-09-26 00:28:14 +00:00
|
|
|
struct SourceLocation
|
|
|
|
{
|
|
|
|
const char* function;
|
|
|
|
const char* file;
|
|
|
|
uint32_t line;
|
2017-09-26 16:54:48 +00:00
|
|
|
uint32_t color;
|
2017-09-26 00:28:14 +00:00
|
|
|
};
|
|
|
|
|
2017-10-03 12:19:32 +00:00
|
|
|
extern moodycamel::ConcurrentQueue<QueueItem> s_queue;
|
|
|
|
extern thread_local moodycamel::ProducerToken s_token;;
|
|
|
|
extern std::atomic<uint64_t> s_id;
|
|
|
|
|
2017-10-03 12:50:55 +00:00
|
|
|
using Magic = moodycamel::ConcurrentQueueDefaultTraits::index_t;
|
|
|
|
|
2017-09-10 15:43:56 +00:00
|
|
|
class Profiler
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Profiler();
|
|
|
|
~Profiler();
|
|
|
|
|
2017-10-03 13:10:25 +00:00
|
|
|
static tracy_force_inline int64_t GetTime( int8_t& cpu )
|
2017-09-25 22:42:09 +00:00
|
|
|
{
|
|
|
|
#if defined _MSC_VER || defined __CYGWIN__
|
|
|
|
unsigned int ui;
|
2017-10-01 17:11:01 +00:00
|
|
|
const auto t = int64_t( __rdtscp( &ui ) );
|
|
|
|
cpu = (int8_t)ui;
|
|
|
|
return t;
|
2017-09-25 22:42:09 +00:00
|
|
|
#else
|
2017-10-01 17:11:01 +00:00
|
|
|
cpu = -1;
|
2017-09-25 22:42:09 +00:00
|
|
|
return std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::high_resolution_clock::now().time_since_epoch() ).count();
|
|
|
|
#endif
|
|
|
|
}
|
2017-09-10 18:08:42 +00:00
|
|
|
|
2017-10-03 13:10:25 +00:00
|
|
|
static tracy_force_inline QueueItem* StartItem( Magic& magic ) { return s_queue.enqueue_begin( s_token, magic ); }
|
|
|
|
static tracy_force_inline void FinishItem( Magic magic ) { s_queue.enqueue_finish( s_token, magic ); }
|
|
|
|
static tracy_force_inline uint64_t GetNewId() { return s_id.fetch_add( 1, std::memory_order_relaxed ); }
|
2017-10-01 15:49:45 +00:00
|
|
|
|
2017-10-03 13:10:25 +00:00
|
|
|
static tracy_force_inline void FrameMark()
|
2017-10-03 12:19:32 +00:00
|
|
|
{
|
|
|
|
int8_t cpu;
|
2017-10-03 12:50:55 +00:00
|
|
|
Magic magic;
|
|
|
|
auto item = s_queue.enqueue_begin( s_token, magic );
|
2017-10-03 12:19:32 +00:00
|
|
|
item->hdr.type = QueueType::FrameMarkMsg;
|
|
|
|
item->hdr.id = (uint64_t)GetTime( cpu );
|
2017-10-03 12:50:55 +00:00
|
|
|
s_queue.enqueue_finish( s_token, magic );
|
2017-10-03 12:19:32 +00:00
|
|
|
}
|
2017-09-10 18:09:14 +00:00
|
|
|
|
2017-09-14 17:23:50 +00:00
|
|
|
static bool ShouldExit();
|
|
|
|
|
2017-09-10 15:43:56 +00:00
|
|
|
private:
|
|
|
|
void Worker();
|
|
|
|
|
2017-09-14 17:07:56 +00:00
|
|
|
bool SendData( const char* data, size_t len );
|
2017-09-21 23:54:04 +00:00
|
|
|
bool SendString( uint64_t ptr, const char* str, QueueType type );
|
2017-09-26 17:00:25 +00:00
|
|
|
void SendSourceLocation( uint64_t ptr );
|
2017-09-21 23:54:04 +00:00
|
|
|
|
|
|
|
bool HandleServerQuery();
|
2017-09-14 17:07:56 +00:00
|
|
|
|
2017-09-23 19:33:05 +00:00
|
|
|
void CalibrateTimer();
|
2017-09-24 14:02:09 +00:00
|
|
|
void CalibrateDelay();
|
2017-09-23 19:33:05 +00:00
|
|
|
|
|
|
|
double m_timerMul;
|
2017-09-29 16:29:39 +00:00
|
|
|
uint64_t m_resolution;
|
2017-09-24 14:02:09 +00:00
|
|
|
uint64_t m_delay;
|
2017-09-10 18:14:16 +00:00
|
|
|
int64_t m_timeBegin;
|
2017-09-22 23:37:07 +00:00
|
|
|
uint64_t m_mainThread;
|
2017-09-10 15:43:56 +00:00
|
|
|
std::thread m_thread;
|
|
|
|
std::atomic<bool> m_shutdown;
|
2017-09-14 17:07:56 +00:00
|
|
|
std::unique_ptr<Socket> m_sock;
|
2017-09-17 11:10:42 +00:00
|
|
|
|
|
|
|
LZ4_stream_t* m_stream;
|
|
|
|
char* m_buffer;
|
|
|
|
int m_bufferOffset;
|
2017-09-10 15:43:56 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|