Browse Source

Add streamline annotations to the tracer

Panagiotis Christopoulos Charitos 1 year ago
parent
commit
0b6bcd2c98
6 changed files with 80 additions and 10 deletions
  1. 21 4
      AnKi/Core/CoreTracer.cpp
  2. 3 0
      AnKi/Core/CoreTracer.h
  3. 4 0
      AnKi/Util/CMakeLists.txt
  4. 33 2
      AnKi/Util/Tracer.cpp
  5. 18 4
      AnKi/Util/Tracer.h
  6. 1 0
      CMakeLists.txt

+ 21 - 4
AnKi/Core/CoreTracer.cpp

@@ -12,6 +12,9 @@
 namespace anki {
 
 BoolCVar g_tracingEnabledCVar(CVarSubsystem::kCore, "Tracing", false, "Enable or disable tracing");
+#if ANKI_OS_ANDROID
+BoolCVar g_streamlineEnabledCVar(CVarSubsystem::kCore, "StreamlineAnnotations", false, "Enable or disable Streamline annotations");
+#endif
 
 #if ANKI_TRACING_ENABLED
 
@@ -94,9 +97,17 @@ CoreTracer::~CoreTracer()
 Error CoreTracer::init(CString directory)
 {
 	Tracer::allocateSingleton();
-	const Bool enableTracer = g_tracingEnabledCVar.get();
-	Tracer::getSingleton().setEnabled(enableTracer);
-	ANKI_CORE_LOGI("Tracing is %s from the beginning", (enableTracer) ? "enabled" : "disabled");
+	if(Tracer::getSingleton().getEnabled() != g_tracingEnabledCVar.get())
+	{
+		// Change the value inside the if because setEnabled prints a message
+		Tracer::getSingleton().setEnabled(g_tracingEnabledCVar.get());
+	}
+#	if ANKI_OS_ANDROID
+	if(Tracer::getSingleton().getStreamlineEnabled())
+	{
+		Tracer::getSingleton().setStreamlineEnabled(g_streamlineEnabledCVar.get());
+	}
+#	endif
 
 	m_thread.start(this, [](ThreadCallbackInfo& info) -> Error {
 		return static_cast<CoreTracer*>(info.m_userData)->threadWorker();
@@ -326,8 +337,14 @@ void CoreTracer::flushFrame(U64 frame)
 	if(Tracer::getSingleton().getEnabled() != g_tracingEnabledCVar.get())
 	{
 		Tracer::getSingleton().setEnabled(g_tracingEnabledCVar.get());
-		ANKI_CORE_LOGI("%s tracing", (g_tracingEnabledCVar.get()) ? "Enabling" : "Disabling");
 	}
+
+#	if ANKI_OS_ANDROID
+	if(Tracer::getSingleton().getStreamlineEnabled() != g_streamlineEnabledCVar.get())
+	{
+		Tracer::getSingleton().setStreamlineEnabled(g_streamlineEnabledCVar.get());
+	}
+#	endif
 }
 
 Error CoreTracer::writeCountersOnShutdown()

+ 3 - 0
AnKi/Core/CoreTracer.h

@@ -17,6 +17,9 @@ namespace anki {
 /// @{
 
 extern BoolCVar g_tracingEnabledCVar;
+#if ANKI_OS_ANDROID
+extern BoolCVar g_streamlineEnabledCVar;
+#endif
 
 #if ANKI_TRACING_ENABLED
 

+ 4 - 0
AnKi/Util/CMakeLists.txt

@@ -50,4 +50,8 @@ if(LINUX OR WINDOWS)
 	set(libs ${libs} reproc)
 endif()
 
+if(ANDROID)
+	set(libs ${libs} AnKiStreamlineAnnotate)
+endif()
+
 target_link_libraries(AnKiUtil ${libs})

+ 33 - 2
AnKi/Util/Tracer.cpp

@@ -7,6 +7,9 @@
 #include <AnKi/Util/HighRezTimer.h>
 #include <AnKi/Util/HashMap.h>
 #include <AnKi/Util/List.h>
+#if ANKI_OS_ANDROID
+#	include <ThirdParty/StreamlineAnnotate/streamline_annotate.h>
+#endif
 
 namespace anki {
 
@@ -34,6 +37,15 @@ public:
 
 thread_local Tracer::ThreadLocal* Tracer::m_threadLocal = nullptr;
 
+Tracer::Tracer()
+{
+	setEnabled(false);
+#	if ANKI_OS_ANDROID
+	ANNOTATE_SETUP;
+	setStreamlineEnabled(false);
+#	endif
+}
+
 Tracer::~Tracer()
 {
 	LockGuard<Mutex> lock(m_allThreadLocalMtx);
@@ -80,13 +92,20 @@ Tracer::Chunk& Tracer::getOrCreateChunk(ThreadLocal& tlocal)
 	return *out;
 }
 
-TracerEventHandle Tracer::beginEvent()
+TracerEventHandle Tracer::beginEvent(const char* eventName)
 {
 	TracerEventHandle out;
 
 	if(m_enabled)
 	{
 		out.m_start = HighRezTimer::getCurrentTime();
+
+#	if ANKI_OS_ANDROID
+		if(m_streamlineEnabled)
+		{
+			ANNOTATE_COLOR(ANNOTATE_RED, eventName);
+		}
+#	endif
 	}
 	else
 	{
@@ -98,7 +117,19 @@ TracerEventHandle Tracer::beginEvent()
 
 void Tracer::endEvent(const char* eventName, TracerEventHandle event)
 {
-	if(!m_enabled || event.m_start == 0.0)
+	if(!m_enabled)
+	{
+		return;
+	}
+
+#	if ANKI_OS_ANDROID
+	if(m_streamlineEnabled)
+	{
+		ANNOTATE_END();
+	}
+#	endif
+
+	if(event.m_start == 0.0)
 	{
 		return;
 	}

+ 18 - 4
AnKi/Util/Tracer.h

@@ -72,7 +72,7 @@ public:
 
 	/// Begin a new event.
 	/// @note It's thread-safe.
-	[[nodiscard]] TracerEventHandle beginEvent();
+	[[nodiscard]] TracerEventHandle beginEvent(const char* eventName);
 
 	/// End the event that got started with beginEvent().
 	/// @note It's thread-safe.
@@ -97,10 +97,23 @@ public:
 
 	void setEnabled(Bool enabled)
 	{
-		ANKI_UTIL_LOGV("Tracing %s", (enabled) ? "enabled" : "disable");
+		ANKI_UTIL_LOGI("Tracing %s", (enabled) ? "enabled" : "disabled");
 		m_enabled = enabled;
 	}
 
+#	if ANKI_OS_ANDROID
+	Bool getStreamlineEnabled() const
+	{
+		return m_streamlineEnabled;
+	}
+
+	void setStreamlineEnabled(Bool enabled)
+	{
+		ANKI_UTIL_LOGI("Streamline annotations %s", (enabled) ? "enabled" : "disabled");
+		m_streamlineEnabled = enabled;
+	}
+#	endif
+
 private:
 	static constexpr U32 kEventsPerChunk = 256;
 	static constexpr U32 kCountersPerChunk = 512;
@@ -116,8 +129,9 @@ private:
 	Mutex m_allThreadLocalMtx;
 
 	Bool m_enabled = false;
+	Bool m_streamlineEnabled = false;
 
-	Tracer() = default;
+	Tracer();
 
 	~Tracer();
 
@@ -136,7 +150,7 @@ public:
 	TracerScopedEvent(const char* name)
 		: m_name(name)
 	{
-		m_handle = Tracer::getSingleton().beginEvent();
+		m_handle = Tracer::getSingleton().beginEvent(name);
 	}
 
 	~TracerScopedEvent()

+ 1 - 0
CMakeLists.txt

@@ -329,6 +329,7 @@ if(ANDROID)
 	set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")
 
 	add_subdirectory(ThirdParty/HwcPipe)
+	add_subdirectory(ThirdParty/StreamlineAnnotate)
 endif()
 
 # DLSS