From dc2cb70e81ce3ce7fbf6b50c07193a5be09d1042 Mon Sep 17 00:00:00 2001
From: ruslantproductengine <ruslantproductengine@lindenlab.com>
Date: Wed, 21 Oct 2015 18:47:24 +0300
Subject: MAINT-4360 FIXED (Setting LogTextureDownloadsToSimulator causes a
 viewer crash)

The fix in fllowing:
LLTextureFetch has object LLTextureInfo which is has Recorder object.

The recorder object activate (Recorder::handleStart()) self AccumulatorBufferGroup
(Recorder::mBuffers into the current (LLTrace::get_thread_recorder()) ThreadRecorder object
which created (as I understand) one per thread, and time to time send accumulated data to the master ThreadRecorder.

The problem is that LLTextureFetch also can uses from the main thread.
I decide add parameter to CTOR LLTextureInfo(bool postponeStartRecoreder) -
if it false the recorder start immediatly in LLTextureInfo CTOR body, if true we need to start it manually.

Also I add another one LLTextureInfo  in LLTextureFetch::mTextureInfoMainThread which is intended
for accumulate data from the main thread.
The postponed Recorder started/stoped from LLTextureFetch::startThread()/endThread().
---
 indra/newview/lltexturefetch.cpp | 10 +++++++---
 indra/newview/lltexturefetch.h   |  1 +
 indra/newview/lltextureinfo.cpp  | 41 ++++++++++++++++++++--------------------
 indra/newview/lltextureinfo.h    |  4 +++-
 4 files changed, 32 insertions(+), 24 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index fab4203ec3..17b273f316 100755
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -2522,7 +2522,8 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
 	  mFetchDebugger(NULL),
 	  mFetchSource(LLTextureFetch::FROM_ALL),
 	  mOriginFetchSource(LLTextureFetch::FROM_ALL),
-	  mFetcherLocked(FALSE)
+	  mFetcherLocked(FALSE),
+	  mTextureInfoMainThread(false)
 {
 	mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
 	mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), U32Bytes(gSavedSettings.getU32("TextureLoggingThreshold")));
@@ -3128,6 +3129,7 @@ void LLTextureFetch::shutDownImageDecodeThread()
 // Threads:  Ttf
 void LLTextureFetch::startThread()
 {
+	mTextureInfo.startRecording();
 }
 
 // Threads:  Ttf
@@ -3138,6 +3140,8 @@ void LLTextureFetch::endThread()
 					  << ", ResWaits:  " << mTotalResourceWaitCount
 					  << ", TotalHTTPReq:  " << getTotalNumHTTPRequests()
 					  << LL_ENDL;
+
+	mTextureInfo.stopRecording();
 }
 
 // Threads:  Ttf
@@ -3541,8 +3545,8 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1
 		if (log_to_viewer_log || log_to_sim)
 		{
 			U64Microseconds timeNow = LLTimer::getTotalTime();
-			mTextureInfo.setRequestSize(id, worker->mFileSize);
-			mTextureInfo.setRequestCompleteTimeAndLog(id, timeNow);
+			mTextureInfoMainThread.setRequestSize(id, worker->mFileSize);
+			mTextureInfoMainThread.setRequestCompleteTimeAndLog(id, timeNow);
 		}
 	}
 	worker->unlockWorkMutex();											// -Mw
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index 27779a31e0..a2658ecd85 100755
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -332,6 +332,7 @@ private:
 	F32 mTextureBandwidth;												// <none>
 	F32 mMaxBandwidth;													// Mfnq
 	LLTextureInfo mTextureInfo;
+	LLTextureInfo mTextureInfoMainThread;
 
 	// XXX possible delete
 	U32Bits mHTTPTextureBits;												// Mfnq
diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp
index 59d692b287..473d8ce709 100755
--- a/indra/newview/lltextureinfo.cpp
+++ b/indra/newview/lltextureinfo.cpp
@@ -36,14 +36,16 @@ static LLTrace::CountStatHandle<S32> sTextureDownloadsCompleted("texture_downloa
 static LLTrace::CountStatHandle<S32Bytes > sTextureDataDownloaded("texture_data_downloaded", "amount of texture data downloaded");
 static LLTrace::CountStatHandle<U32Milliseconds > sTexureDownloadTime("texture_download_time", "amount of time spent fetching textures");
 
-LLTextureInfo::LLTextureInfo() : 
+LLTextureInfo::LLTextureInfo(bool postponeStartRecoreder) :
 	mLogTextureDownloadsToViewerLog(false),
 	mLogTextureDownloadsToSimulator(false),
 	mTextureDownloadProtocol("NONE"),
 	mTextureLogThreshold(LLUnits::Kilobytes::fromValue(100))
 {
-	mTextures.clear();
-	mRecording.start();
+	if (!postponeStartRecoreder)
+	{
+		startRecording();
+	}
 }
 
 void LLTextureInfo::setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold)
@@ -78,15 +80,7 @@ U32 LLTextureInfo::getTextureInfoMapSize()
 
 bool LLTextureInfo::has(const LLUUID& id)
 {
-	std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
-	if (iterator == mTextures.end())
-	{
-		return false;
-	}
-	else
-	{
-		return true;
-	}
+	return mTextures.end() != mTextures.find(id);
 }
 
 void LLTextureInfo::setRequestStartTime(const LLUUID& id, U64 startTime)
@@ -192,15 +186,12 @@ void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64Microsecon
 LLSD LLTextureInfo::getAverages()
 {
 	LLSD averagedTextureData;
-	S32 averageDownloadRate;
-	U32Milliseconds download_time = mRecording.getSum(sTexureDownloadTime);
-	if(download_time == (U32Milliseconds)0)
-	{
-		averageDownloadRate = 0;
-	}
-	else
+	S32 averageDownloadRate = 0;
+	unsigned int download_time = mRecording.getSum(sTexureDownloadTime).valueInUnits<LLUnits::Seconds>();
+	
+	if (0 != download_time)
 	{
-		averageDownloadRate = mRecording.getSum(sTextureDataDownloaded).valueInUnits<LLUnits::Bits>() / download_time.valueInUnits<LLUnits::Seconds>();
+		averageDownloadRate = mRecording.getSum(sTextureDataDownloaded).valueInUnits<LLUnits::Bits>() / download_time;
 	}
 
 	averagedTextureData["bits_per_second"]             = averageDownloadRate;
@@ -212,6 +203,16 @@ LLSD LLTextureInfo::getAverages()
 	return averagedTextureData;
 }
 
+void LLTextureInfo::startRecording()
+{
+	mRecording.start();
+}
+
+void LLTextureInfo::stopRecording()
+{
+	mRecording.stop();
+}
+
 void LLTextureInfo::resetTextureStatistics()
 {
 	mRecording.restart();
diff --git a/indra/newview/lltextureinfo.h b/indra/newview/lltextureinfo.h
index 176f2cbb74..03721bdd73 100755
--- a/indra/newview/lltextureinfo.h
+++ b/indra/newview/lltextureinfo.h
@@ -35,7 +35,7 @@
 class LLTextureInfo
 {
 public:
-	LLTextureInfo();
+	LLTextureInfo(bool postponeStartRecoreder = true);
 	~LLTextureInfo();
 
 	void setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold);
@@ -53,6 +53,8 @@ public:
 	void resetTextureStatistics();
 	U32 getTextureInfoMapSize();
 	LLSD getAverages();
+	void startRecording();
+	void stopRecording();
 
 private:
 	void addRequest(const LLUUID& id);
-- 
cgit v1.2.3


From 1ce674c03f76c027c78191825fcdc8d61d6ca5da Mon Sep 17 00:00:00 2001
From: ruslantproductengine <ruslantproductengine@lindenlab.com>
Date: Wed, 21 Oct 2015 18:47:24 +0300
Subject: MAINT-4360 FIXED (Setting LogTextureDownloadsToSimulator causes a
 viewer crash)

The fix in fllowing:
LLTextureFetch has object LLTextureInfo which is has Recorder object.

The recorder object activate (Recorder::handleStart()) self AccumulatorBufferGroup
(Recorder::mBuffers into the current (LLTrace::get_thread_recorder()) ThreadRecorder object
which created (as I understand) one per thread, and time to time send accumulated data to the master ThreadRecorder.

The problem is that LLTextureFetch also can uses from the main thread.
I decide add parameter to CTOR LLTextureInfo(bool postponeStartRecoreder) -
if it false the recorder start immediatly in LLTextureInfo CTOR body, if true we need to start it manually.

Also I add another one LLTextureInfo  in LLTextureFetch::mTextureInfoMainThread which is intended
for accumulate data from the main thread.
The postponed Recorder started/stoped from LLTextureFetch::startThread()/endThread().
---
 indra/newview/lltexturefetch.cpp | 10 +++++++---
 indra/newview/lltexturefetch.h   |  1 +
 indra/newview/lltextureinfo.cpp  | 41 ++++++++++++++++++++--------------------
 indra/newview/lltextureinfo.h    |  4 +++-
 4 files changed, 32 insertions(+), 24 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index fab4203ec3..17b273f316 100755
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -2522,7 +2522,8 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
 	  mFetchDebugger(NULL),
 	  mFetchSource(LLTextureFetch::FROM_ALL),
 	  mOriginFetchSource(LLTextureFetch::FROM_ALL),
-	  mFetcherLocked(FALSE)
+	  mFetcherLocked(FALSE),
+	  mTextureInfoMainThread(false)
 {
 	mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
 	mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), U32Bytes(gSavedSettings.getU32("TextureLoggingThreshold")));
@@ -3128,6 +3129,7 @@ void LLTextureFetch::shutDownImageDecodeThread()
 // Threads:  Ttf
 void LLTextureFetch::startThread()
 {
+	mTextureInfo.startRecording();
 }
 
 // Threads:  Ttf
@@ -3138,6 +3140,8 @@ void LLTextureFetch::endThread()
 					  << ", ResWaits:  " << mTotalResourceWaitCount
 					  << ", TotalHTTPReq:  " << getTotalNumHTTPRequests()
 					  << LL_ENDL;
+
+	mTextureInfo.stopRecording();
 }
 
 // Threads:  Ttf
@@ -3541,8 +3545,8 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1
 		if (log_to_viewer_log || log_to_sim)
 		{
 			U64Microseconds timeNow = LLTimer::getTotalTime();
-			mTextureInfo.setRequestSize(id, worker->mFileSize);
-			mTextureInfo.setRequestCompleteTimeAndLog(id, timeNow);
+			mTextureInfoMainThread.setRequestSize(id, worker->mFileSize);
+			mTextureInfoMainThread.setRequestCompleteTimeAndLog(id, timeNow);
 		}
 	}
 	worker->unlockWorkMutex();											// -Mw
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index 27779a31e0..a2658ecd85 100755
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -332,6 +332,7 @@ private:
 	F32 mTextureBandwidth;												// <none>
 	F32 mMaxBandwidth;													// Mfnq
 	LLTextureInfo mTextureInfo;
+	LLTextureInfo mTextureInfoMainThread;
 
 	// XXX possible delete
 	U32Bits mHTTPTextureBits;												// Mfnq
diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp
index 59d692b287..473d8ce709 100755
--- a/indra/newview/lltextureinfo.cpp
+++ b/indra/newview/lltextureinfo.cpp
@@ -36,14 +36,16 @@ static LLTrace::CountStatHandle<S32> sTextureDownloadsCompleted("texture_downloa
 static LLTrace::CountStatHandle<S32Bytes > sTextureDataDownloaded("texture_data_downloaded", "amount of texture data downloaded");
 static LLTrace::CountStatHandle<U32Milliseconds > sTexureDownloadTime("texture_download_time", "amount of time spent fetching textures");
 
-LLTextureInfo::LLTextureInfo() : 
+LLTextureInfo::LLTextureInfo(bool postponeStartRecoreder) :
 	mLogTextureDownloadsToViewerLog(false),
 	mLogTextureDownloadsToSimulator(false),
 	mTextureDownloadProtocol("NONE"),
 	mTextureLogThreshold(LLUnits::Kilobytes::fromValue(100))
 {
-	mTextures.clear();
-	mRecording.start();
+	if (!postponeStartRecoreder)
+	{
+		startRecording();
+	}
 }
 
 void LLTextureInfo::setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold)
@@ -78,15 +80,7 @@ U32 LLTextureInfo::getTextureInfoMapSize()
 
 bool LLTextureInfo::has(const LLUUID& id)
 {
-	std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
-	if (iterator == mTextures.end())
-	{
-		return false;
-	}
-	else
-	{
-		return true;
-	}
+	return mTextures.end() != mTextures.find(id);
 }
 
 void LLTextureInfo::setRequestStartTime(const LLUUID& id, U64 startTime)
@@ -192,15 +186,12 @@ void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64Microsecon
 LLSD LLTextureInfo::getAverages()
 {
 	LLSD averagedTextureData;
-	S32 averageDownloadRate;
-	U32Milliseconds download_time = mRecording.getSum(sTexureDownloadTime);
-	if(download_time == (U32Milliseconds)0)
-	{
-		averageDownloadRate = 0;
-	}
-	else
+	S32 averageDownloadRate = 0;
+	unsigned int download_time = mRecording.getSum(sTexureDownloadTime).valueInUnits<LLUnits::Seconds>();
+	
+	if (0 != download_time)
 	{
-		averageDownloadRate = mRecording.getSum(sTextureDataDownloaded).valueInUnits<LLUnits::Bits>() / download_time.valueInUnits<LLUnits::Seconds>();
+		averageDownloadRate = mRecording.getSum(sTextureDataDownloaded).valueInUnits<LLUnits::Bits>() / download_time;
 	}
 
 	averagedTextureData["bits_per_second"]             = averageDownloadRate;
@@ -212,6 +203,16 @@ LLSD LLTextureInfo::getAverages()
 	return averagedTextureData;
 }
 
+void LLTextureInfo::startRecording()
+{
+	mRecording.start();
+}
+
+void LLTextureInfo::stopRecording()
+{
+	mRecording.stop();
+}
+
 void LLTextureInfo::resetTextureStatistics()
 {
 	mRecording.restart();
diff --git a/indra/newview/lltextureinfo.h b/indra/newview/lltextureinfo.h
index 176f2cbb74..03721bdd73 100755
--- a/indra/newview/lltextureinfo.h
+++ b/indra/newview/lltextureinfo.h
@@ -35,7 +35,7 @@
 class LLTextureInfo
 {
 public:
-	LLTextureInfo();
+	LLTextureInfo(bool postponeStartRecoreder = true);
 	~LLTextureInfo();
 
 	void setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold);
@@ -53,6 +53,8 @@ public:
 	void resetTextureStatistics();
 	U32 getTextureInfoMapSize();
 	LLSD getAverages();
+	void startRecording();
+	void stopRecording();
 
 private:
 	void addRequest(const LLUUID& id);
-- 
cgit v1.2.3


From 501033f521f2de7c47525996541e179670222792 Mon Sep 17 00:00:00 2001
From: ruslantproductengine <ruslantproductengine@lindenlab.com>
Date: Tue, 27 Oct 2015 18:06:36 +0200
Subject: MAINT-3491 FIXED If ALM is enabled while in wireframe mode, disabling
 wireframe mode results in a black screen.

---
 indra/newview/llappviewer.cpp  |  5 ++++-
 indra/newview/llappviewer.h    |  1 +
 indra/newview/llviewermenu.cpp | 15 +++++++++++++++
 3 files changed, 20 insertions(+), 1 deletion(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index fbf2a04bcc..260a3d8ce4 100755
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -327,7 +327,10 @@ BOOL				gDisconnected = FALSE;
 // used to restore texture state after a mode switch
 LLFrameTimer	gRestoreGLTimer;
 BOOL			gRestoreGL = FALSE;
-BOOL				gUseWireframe = FALSE;
+BOOL			gUseWireframe = FALSE;
+
+//use for remember deferred mode in wireframe switch
+BOOL			gInitialDeferredModeForWireframe = FALSE;
 
 // VFS globals - see llappviewer.h
 LLVFS* gStaticVFS = NULL;
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 718871138e..ad5268496b 100755
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -375,6 +375,7 @@ extern BOOL		gDisconnected;
 extern LLFrameTimer	gRestoreGLTimer;
 extern BOOL			gRestoreGL;
 extern BOOL		gUseWireframe;
+extern BOOL		gInitialDeferredModeForWireframe;
 
 // VFS globals - gVFS is for general use
 // gStaticVFS is read-only and is shipped w/ the viewer
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 38d62dee5e..de219edcff 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -1245,9 +1245,24 @@ class LLAdvancedToggleWireframe : public view_listener_t
 	bool handleEvent(const LLSD& userdata)
 	{
 		gUseWireframe = !(gUseWireframe);
+
+		if (gUseWireframe)
+		{
+			gInitialDeferredModeForWireframe = LLPipeline::sRenderDeferred;
+		}
+
 		gWindowResized = TRUE;
 		LLPipeline::updateRenderDeferred();
 		gPipeline.resetVertexBuffers();
+
+		if (!gUseWireframe && !gInitialDeferredModeForWireframe && LLPipeline::sRenderDeferred != gInitialDeferredModeForWireframe && gPipeline.isInit())
+		{
+			LLPipeline::refreshCachedSettings();
+			gPipeline.releaseGLBuffers();
+			gPipeline.createGLBuffers();
+			LLViewerShaderMgr::instance()->setShaders();
+		}
+
 		return true;
 	}
 };
-- 
cgit v1.2.3


From 515c06727ce2f6ebb670f8a470bfc4b319a57224 Mon Sep 17 00:00:00 2001
From: Mnikolenko ProductEngine <mnikolenko@productengine.com>
Date: Wed, 28 Oct 2015 12:12:19 +0200
Subject: MAINT-5762 FIXED Groups - Message about number of groups you can join
 does not recognize that your account is premium

---
 indra/newview/llpanelpeople.cpp                     | 7 ++++++-
 indra/newview/skins/default/xui/en/panel_people.xml | 5 ++++-
 2 files changed, 10 insertions(+), 2 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 6b86459d8f..e28f37ccb0 100755
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -587,7 +587,12 @@ BOOL LLPanelPeople::postBuild()
 	getChild<LLFilterEditor>("groups_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
 	getChild<LLFilterEditor>("recent_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
 	getChild<LLFilterEditor>("fbc_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
-	getChild<LLTextBox>("groupcount")->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this));
+
+	if(gMaxAgentGroups <= BASE_MAX_AGENT_GROUPS)
+	{
+	    getChild<LLTextBox>("groupcount")->setText(getString("GroupCountWithInfo"));
+	    getChild<LLTextBox>("groupcount")->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this));
+	}
 
 	mTabContainer = getChild<LLTabContainer>("tabs");
 	mTabContainer->setCommitCallback(boost::bind(&LLPanelPeople::onTabSelected, this, _2));
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 4fb8b9a67f..2cb06d6877 100755
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -53,6 +53,9 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
 	<string
 	 name="AltMiniMapToolTipMsg"
 	 value="[REGION](Double-click to teleport, shift-drag to pan)"/>
+	<string
+	 name="GroupCountWithInfo"
+	 value="You belong to [COUNT] groups, and can join [REMAINING] more.  [secondlife:/// Want more?]"/>
     <tab_container
      bottom="-10"
      follows="all"
@@ -506,7 +509,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
                 left="3"
                 use_ellipses="true"
                 name="groupcount">
-              You belong to [COUNT] groups, and can join [REMAINING] more.  [secondlife:/// Want more?]
+              You belong to [COUNT] groups, and can join [REMAINING] more.
             </text>
             <group_list
              allow_select="true" 
-- 
cgit v1.2.3