profiler hierarchy
This commit is contained in:
		| @@ -21,36 +21,62 @@ | ||||
| Profiler* g_profiler = nullptr; | ||||
| ProfilerListener* g_profilerListener = nullptr; | ||||
|  | ||||
| Profiler::Profiler() | ||||
| Profiler::Profiler() : m_pool(sizeof(ProfilerNode)) | ||||
| { | ||||
| 	m_root = nullptr; | ||||
| 	m_top = nullptr; | ||||
| } | ||||
|  | ||||
| Profiler::~Profiler() | ||||
| { | ||||
| 	B3_ASSERT(m_root == nullptr); | ||||
| 	B3_ASSERT(m_top == nullptr); | ||||
| } | ||||
|  | ||||
| ProfilerNode* Profiler::CreateNode() | ||||
| { | ||||
| 	void* block = m_pool.Allocate(); | ||||
| 	ProfilerNode* n = new (block) ProfilerNode(); | ||||
| 	return n; | ||||
| } | ||||
|  | ||||
| void Profiler::DestroyNode(ProfilerNode* node) | ||||
| { | ||||
| 	node->~ProfilerNode(); | ||||
| 	m_pool.Free(node); | ||||
| } | ||||
|  | ||||
| void Profiler::PushEvent(const char* name) | ||||
| { | ||||
| 	m_time.Update(); | ||||
|  | ||||
| 	ProfilerEvent e; | ||||
| 	e.t0 = m_time.GetCurrentMilis(); | ||||
| 	e.t1 = -1.0; | ||||
| 	e.name = name; | ||||
| 	e.parent = m_top; | ||||
| 	ProfilerNode* n = CreateNode(); | ||||
| 	n->name = name; | ||||
| 	n->t0 = m_time.GetCurrentMilis(); | ||||
| 	n->t1 = 0.0; | ||||
| 	n->parent = m_top; | ||||
|  | ||||
| 	m_events.PushBack(e); | ||||
| 	if (m_root == nullptr) | ||||
| 	{ | ||||
| 		m_root = n; | ||||
| 		m_top = n; | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	m_top = &m_events.Back(); | ||||
| 	if (m_top) | ||||
| 	{ | ||||
| 		m_top->children.PushBack(n); | ||||
| 	} | ||||
|  | ||||
| 	m_top = n; | ||||
| } | ||||
|  | ||||
| void Profiler::PopEvent() | ||||
| { | ||||
| 	m_time.Update(); | ||||
| 	 | ||||
| 	B3_ASSERT(m_top != nullptr); | ||||
| 	m_top->t1 = m_time.GetCurrentMilis(); | ||||
|  | ||||
| 	B3_ASSERT(m_top->t1 > m_top->t0); | ||||
|  | ||||
| 	m_top = m_top->parent; | ||||
| @@ -59,12 +85,41 @@ void Profiler::PopEvent() | ||||
| void Profiler::Begin() | ||||
| { | ||||
| 	// If this assert is hit then it means Profiler::End hasn't been called. | ||||
| 	B3_ASSERT(m_events.IsEmpty()); | ||||
| 	B3_ASSERT(m_top == NULL); | ||||
| 	B3_ASSERT(m_root == nullptr); | ||||
| 	B3_ASSERT(m_top == nullptr); | ||||
| } | ||||
|  | ||||
| static inline void RecurseEvents(ProfilerNode* node) | ||||
| { | ||||
| 	ProfilerListener* listener = g_profilerListener; | ||||
|  | ||||
| 	if (listener) | ||||
| 	{ | ||||
| 		listener->BeginEvent(node->name, node->t0); | ||||
|  | ||||
| 		listener->EndEvent(node->name, node->t1); | ||||
| 	} | ||||
|  | ||||
| 	for (u32 i = 0; i < node->children.Count(); ++i) | ||||
| 	{ | ||||
| 		RecurseEvents(node->children[i]); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void Profiler::RecurseDestroy(ProfilerNode* node) | ||||
| { | ||||
| 	for (u32 i = 0; i < node->children.Count(); ++i) | ||||
| 	{ | ||||
| 		RecurseDestroy(node->children[i]); | ||||
| 	} | ||||
|  | ||||
| 	DestroyNode(node); | ||||
| } | ||||
|  | ||||
| void Profiler::End() | ||||
| { | ||||
| 	B3_ASSERT(m_top == nullptr); | ||||
| 	 | ||||
| 	ProfilerListener* listener = g_profilerListener; | ||||
|  | ||||
| 	if (listener) | ||||
| @@ -72,22 +127,12 @@ void Profiler::End() | ||||
| 		listener->BeginEvents(); | ||||
| 	} | ||||
|  | ||||
| 	for (u32 i = 0; i < m_events.Count(); ++i) | ||||
| 	{ | ||||
| 		ProfilerEvent e = m_events[i]; | ||||
| 	RecurseEvents(m_root); | ||||
| 	 | ||||
| 	RecurseDestroy(m_root); | ||||
| 	m_root = nullptr; | ||||
|  | ||||
| 		if (listener) | ||||
| 		{ | ||||
| 			listener->BeginEvent(e.name, e.t0); | ||||
|  | ||||
| 			listener->EndEvent(e.name, e.t1); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	m_events.Resize(0); | ||||
|  | ||||
| 	B3_ASSERT(m_events.IsEmpty()); | ||||
| 	B3_ASSERT(m_top == NULL); | ||||
| 	B3_ASSERT(m_root == nullptr); | ||||
|  | ||||
| 	if (listener) | ||||
| 	{ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user