Browse Source

Make tracing toggleable

Panagiotis Christopoulos Charitos 7 years ago
parent
commit
adde53aab2
5 changed files with 111 additions and 36 deletions
  1. 5 0
      sandbox/Main.cpp
  2. 1 0
      src/anki/Core.h
  3. 6 6
      src/anki/core/App.cpp
  4. 99 4
      src/anki/core/Trace.h
  5. 0 26
      src/anki/util/Tracer.h

+ 5 - 0
sandbox/Main.cpp

@@ -161,6 +161,11 @@ Error MyApp::userMainLoop(Bool& quit)
 		renderer.getDbg().switchDepthTestEnabled();
 	}
 
+	if(in.getKey(KeyCode::F12) == 1)
+	{
+		CoreTracerSingleton::get().m_enabled = !CoreTracerSingleton::get().m_enabled;
+	}
+
 #if !PLAYER
 	if(in.getKey(KeyCode::UP))
 		mover->rotateLocalX(ang);

+ 1 - 0
src/anki/Core.h

@@ -8,3 +8,4 @@
 #include <anki/core/App.h>
 #include <anki/core/Config.h>
 #include <anki/core/NativeWindow.h>
+#include <anki/core/Trace.h>

+ 6 - 6
src/anki/core/App.cpp

@@ -337,16 +337,16 @@ void App::cleanup()
 	}
 
 #if ANKI_ENABLE_TRACE
-	if(TracerSingleton::get().isInitialized())
+	if(CoreTracerSingleton::get().isInitialized())
 	{
 		StringAuto fname(m_heapAlloc);
 		fname.sprintf("%s/trace", m_settingsDir.cstr());
 		ANKI_CORE_LOGI("Will dump trace files: %s", fname.cstr());
-		if(TracerSingleton::get().flush(fname.toCString()))
+		if(CoreTracerSingleton::get().flush(fname.toCString()))
 		{
 			ANKI_CORE_LOGE("Ignoring error from the tracer");
 		}
-		TracerSingleton::destroy();
+		CoreTracerSingleton::destroy();
 	}
 #endif
 
@@ -375,8 +375,8 @@ Error App::initInternal(const ConfigSet& config_, AllocAlignedCallback allocCb,
 	m_heapAlloc = HeapAllocator<U8>(m_allocCb, m_allocCbData);
 
 #if ANKI_ENABLE_TRACE
-	TracerSingleton::get().init(m_heapAlloc);
-	TracerSingleton::get().newFrame(0);
+	CoreTracerSingleton::get().init(m_heapAlloc);
+	CoreTracerSingleton::get().newFrame(0);
 #endif
 
 	ANKI_CHECK(initDirs(config));
@@ -620,7 +620,7 @@ Error App::mainLoop()
 	{
 #if ANKI_ENABLE_TRACE
 		static U64 frame = 1;
-		TracerSingleton::get().newFrame(frame++);
+		CoreTracerSingleton::get().newFrame(frame++);
 #endif
 		ANKI_TRACE_START_EVENT(FRAME);
 		const Second startTime = HighRezTimer::getCurrentTime();

+ 99 - 4
src/anki/core/Trace.h

@@ -8,13 +8,106 @@
 #include <anki/core/Common.h>
 #include <anki/util/Tracer.h>
 
+namespace anki
+{
+
+/// @addtogroup core
+/// @{
+
+/// Core tracer.
+class CoreTracer
+{
+public:
+	Tracer m_tracer;
+	Bool m_enabled = false;
+
+	/// @copydoc Tracer::init
+	void init(GenericMemoryPoolAllocator<U8> alloc)
+	{
+		m_tracer.init(alloc);
+	}
+
+	/// @copydoc Tracer::isInitialized
+	Bool isInitialized() const
+	{
+		return m_tracer.isInitialized();
+	}
+
+	/// @copydoc Tracer::beginEvent
+	ANKI_USE_RESULT TracerEventHandle beginEvent()
+	{
+		if(m_enabled)
+		{
+			return m_tracer.beginEvent();
+		}
+
+		return nullptr;
+	}
+
+	/// @copydoc Tracer::endEvent
+	void endEvent(const char* eventName, TracerEventHandle event)
+	{
+		if(event != nullptr)
+		{
+			m_tracer.endEvent(eventName, event);
+		}
+	}
+
+	/// @copydoc Tracer::increaseCounter
+	void increaseCounter(const char* counterName, U64 value)
+	{
+		if(m_enabled)
+		{
+			m_tracer.increaseCounter(counterName, value);
+		}
+	}
+
+	/// @copydoc Tracer::newFrame
+	void newFrame(U64 frame)
+	{
+		if(m_enabled)
+		{
+			m_tracer.newFrame(frame);
+		}
+	}
+
+	/// @copydoc Tracer::flush
+	ANKI_USE_RESULT Error flush(CString filename)
+	{
+		return m_tracer.flush(filename);
+	}
+};
+
+using CoreTracerSingleton = Singleton<CoreTracer>;
+
+class CoreTraceScopedEvent
+{
+public:
+	CoreTraceScopedEvent(const char* name)
+		: m_name(name)
+		, m_tracer(&CoreTracerSingleton::get())
+	{
+		m_handle = m_tracer->beginEvent();
+	}
+
+	~CoreTraceScopedEvent()
+	{
+		m_tracer->endEvent(m_name, m_handle);
+	}
+
+private:
+	const char* m_name;
+	TracerEventHandle m_handle;
+	CoreTracer* m_tracer;
+};
+
 /// @name Trace macros.
 /// @{
 #if ANKI_ENABLE_TRACE
-#	define ANKI_TRACE_START_EVENT(name_) TracerEventHandle _teh##name_ = TracerSingleton::get().beginEvent()
-#	define ANKI_TRACE_STOP_EVENT(name_) TracerSingleton::get().endEvent(#	name_, _teh##name_)
-#	define ANKI_TRACE_SCOPED_EVENT(name_) TraceScopedEvent _tse##name_(#	name_)
-#	define ANKI_TRACE_INC_COUNTER(name_, val_) TracerSingleton::get().increaseCounter(#	name_, val_)
+#	define ANKI_TRACE_START_EVENT(name_) TracerEventHandle _teh##name_ = CoreTracerSingleton::get().beginEvent()
+#	define ANKI_TRACE_STOP_EVENT(name_) CoreTracerSingleton::get().endEvent(#	name_, _teh##name_)
+#	define ANKI_TRACE_SCOPED_EVENT(name_) CoreTraceScopedEvent _tse##name_(#	name_)
+#	define ANKI_TRACE_INC_COUNTER(name_, val_) CoreTracerSingleton::get().increaseCounter(#	name_, val_)
 #else
 #	define ANKI_TRACE_START_EVENT(name_) ((void)0)
 #	define ANKI_TRACE_STOP_EVENT(name_) ((void)0)
@@ -22,3 +115,5 @@
 #	define ANKI_TRACE_INC_COUNTER(name_, val_) ((void)0)
 #endif
 /// @}
+
+} // end namespace anki

+ 0 - 26
src/anki/util/Tracer.h

@@ -8,7 +8,6 @@
 #include <anki/util/File.h>
 #include <anki/util/List.h>
 #include <anki/util/ObjectAllocator.h>
-#include <anki/util/Singleton.h>
 
 namespace anki
 {
@@ -97,31 +96,6 @@ private:
 
 	static void getSpreadsheetColumnName(U column, Array<char, 3>& arr);
 };
-
-/// Tracer singleton.
-using TracerSingleton = Singleton<Tracer>;
-
-/// Convenience class to trace an event.
-class TraceScopedEvent
-{
-public:
-	TraceScopedEvent(const char* name)
-		: m_name(name)
-		, m_tracer(&TracerSingleton::get())
-	{
-		m_handle = m_tracer->beginEvent();
-	}
-
-	~TraceScopedEvent()
-	{
-		m_tracer->endEvent(m_name, m_handle);
-	}
-
-private:
-	const char* m_name;
-	TracerEventHandle m_handle;
-	Tracer* m_tracer;
-};
 /// @}
 
 } // end namespace anki