From c6737163854981d94fde8bdd440eaf4bbc816b4f Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Tue, 23 Apr 2013 18:52:34 -0700
Subject: [PATCH] SH-3931 WIP Interesting: Add graphs to visualize scene load
 metrics convert scene monitor to use extendable periodic recording

---
 indra/llcommon/lltracerecording.cpp | 61 +++++++++++++++++++++++++++++
 indra/llcommon/lltracerecording.h   | 56 ++++++--------------------
 indra/newview/llscenemonitor.cpp    |  2 +-
 indra/newview/llscenemonitor.h      |  4 +-
 4 files changed, 76 insertions(+), 47 deletions(-)

diff --git a/indra/llcommon/lltracerecording.cpp b/indra/llcommon/lltracerecording.cpp
index 2917c217d79..af7b61dd4e1 100644
--- a/indra/llcommon/lltracerecording.cpp
+++ b/indra/llcommon/lltracerecording.cpp
@@ -464,8 +464,62 @@ void PeriodicRecording::appendPeriodicRecording( PeriodicRecording& other )
 	other.setPlayState(other_play_state);
 }
 
+LLUnit<LLUnits::Seconds, F64> PeriodicRecording::getDuration()
+{
+	LLUnit<LLUnits::Seconds, F64> duration;
+	size_t num_periods = mRecordingPeriods.size();
+	for (size_t i = 1; i <= num_periods; i++)
+	{
+		size_t index = (mCurPeriod + num_periods - i) % num_periods;
+		duration += mRecordingPeriods[index].getDuration();
+	}
+	return duration;
+}
 
 
+LLTrace::Recording PeriodicRecording::snapshotCurRecording() const
+{
+	Recording recording_copy(getCurRecording());
+	recording_copy.stop();
+	return recording_copy;
+}
+
+
+Recording& PeriodicRecording::getLastRecording()
+{
+	U32 num_periods = mRecordingPeriods.size();
+	return mRecordingPeriods[(mCurPeriod + num_periods - 1) % num_periods];
+}
+
+const Recording& PeriodicRecording::getLastRecording() const
+{
+	return getPrevRecording(1);
+}
+
+Recording& PeriodicRecording::getCurRecording()
+{
+	return mRecordingPeriods[mCurPeriod];
+}
+
+const Recording& PeriodicRecording::getCurRecording() const
+{
+	return mRecordingPeriods[mCurPeriod];
+}
+
+Recording& PeriodicRecording::getPrevRecording( U32 offset )
+{
+	U32 num_periods = mRecordingPeriods.size();
+	offset = llclamp(offset, 0u, num_periods - 1);
+	return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods];
+}
+
+const Recording& PeriodicRecording::getPrevRecording( U32 offset ) const
+{
+	U32 num_periods = mRecordingPeriods.size();
+	offset = llclamp(offset, 0u, num_periods - 1);
+	return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods];
+}
+
 void PeriodicRecording::start()
 {
 	getCurRecording().start();
@@ -577,6 +631,13 @@ void ExtendableRecording::splitFrom(ExtendableRecording& other)
 // ExtendablePeriodicRecording
 ///////////////////////////////////////////////////////////////////////
 
+
+ExtendablePeriodicRecording::ExtendablePeriodicRecording() 
+:	mAcceptedRecording(0), 
+	mPotentialRecording(0)
+{
+}
+
 void ExtendablePeriodicRecording::extend()
 {
 	// stop recording to get latest data
diff --git a/indra/llcommon/lltracerecording.h b/indra/llcommon/lltracerecording.h
index 23b031b49b9..84006a10b85 100644
--- a/indra/llcommon/lltracerecording.h
+++ b/indra/llcommon/lltracerecording.h
@@ -254,49 +254,16 @@ namespace LLTrace
 		void nextPeriod();
 		U32 getNumPeriods() { return mRecordingPeriods.size(); }
 
-		void appendPeriodicRecording(PeriodicRecording& other);
-
-		Recording& getLastRecording()
-		{
-			U32 num_periods = mRecordingPeriods.size();
-			return mRecordingPeriods[(mCurPeriod + num_periods - 1) % num_periods];
-		}
-
-		const Recording& getLastRecording() const
-		{
-			return getPrevRecording(1);
-		}
-
-		Recording& getCurRecording()
-		{
-			return mRecordingPeriods[mCurPeriod];
-		}
-
-		const Recording& getCurRecording() const
-		{
-			return mRecordingPeriods[mCurPeriod];
-		}
-
-		Recording& getPrevRecording(U32 offset)
-		{
-			U32 num_periods = mRecordingPeriods.size();
-			offset = llclamp(offset, 0u, num_periods - 1);
-			return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods];
-		}
+		LLUnit<LLUnits::Seconds, F64> getDuration();
 
-		const Recording& getPrevRecording(U32 offset) const
-		{
-			U32 num_periods = mRecordingPeriods.size();
-			offset = llclamp(offset, 0u, num_periods - 1);
-			return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods];
-		}
-
-		Recording snapshotCurRecording() const
-		{
-			Recording recording_copy(getCurRecording());
-			recording_copy.stop();
-			return recording_copy;
-		}
+		void appendPeriodicRecording(PeriodicRecording& other);
+		Recording& getLastRecording();
+		const Recording& getLastRecording() const;
+		Recording& getCurRecording();
+		const Recording& getCurRecording() const;
+		Recording& getPrevRecording(U32 offset);
+		const Recording& getPrevRecording(U32 offset) const;
+		Recording snapshotCurRecording() const;
 
 		template <typename T>
 		typename T::value_t getPeriodMin(const TraceType<T>& stat, size_t num_periods = U32_MAX) const
@@ -447,10 +414,11 @@ namespace LLTrace
 	:	public LLStopWatchControlsMixin<ExtendablePeriodicRecording>
 	{
 	public:
+		ExtendablePeriodicRecording();
 		void extend();
 
-		PeriodicRecording& getAcceptedRecording() { return mAcceptedRecording; }
-		const PeriodicRecording& getAcceptedRecording() const {return mAcceptedRecording;}
+		PeriodicRecording& getAcceptedRecording()				{ return mAcceptedRecording; }
+		const PeriodicRecording& getAcceptedRecording() const	{return mAcceptedRecording;}
 
 		// implementation for LLStopWatchControlsMixin
 		/*virtual*/ void start();
diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp
index 15fe77f028a..7f7e61cc886 100644
--- a/indra/newview/llscenemonitor.cpp
+++ b/indra/newview/llscenemonitor.cpp
@@ -73,7 +73,7 @@ LLSceneMonitor::LLSceneMonitor() :
 	mFrames[0] = NULL;
 	mFrames[1] = NULL;
 
-	mRecording = new LLTrace::ExtendableRecording();
+	mRecording = new LLTrace::ExtendablePeriodicRecording();
 	mRecording->start();
 }
 
diff --git a/indra/newview/llscenemonitor.h b/indra/newview/llscenemonitor.h
index c897b237b65..45a5241924d 100644
--- a/indra/newview/llscenemonitor.h
+++ b/indra/newview/llscenemonitor.h
@@ -63,7 +63,7 @@ class LLSceneMonitor :  public LLSingleton<LLSceneMonitor>
 	bool isEnabled()const {return mEnabled;}
 	bool needsUpdate() const;
 	
-	LLTrace::ExtendableRecording* getRecording() const {return mRecording;}
+	LLTrace::ExtendablePeriodicRecording* getRecording() const {return mRecording;}
 	void dumpToFile(std::string file_name);
 	bool hasResults() const { return !mMonitorResults.empty();}
 
@@ -102,7 +102,7 @@ class LLSceneMonitor :  public LLSingleton<LLSceneMonitor>
 
 	std::vector<LLAnimPauseRequest> mAvatarPauseHandles;
 
-	LLTrace::ExtendableRecording* mRecording;
+	LLTrace::ExtendablePeriodicRecording* mRecording;
 
 	//---------------------------------------
 	typedef struct _monitor_result
-- 
GitLab