From 0aaf52c77c6c65258ca580557b6fd0766011471c Mon Sep 17 00:00:00 2001
From: Cosmic Linden <cosmic@lindenlab.com>
Date: Fri, 8 Jul 2022 16:25:21 -0700
Subject: [PATCH] SL-17691: Make objects active if there are too many material
 updates from the server

---
 indra/newview/llvovolume.cpp | 21 +++++++++++++++------
 indra/newview/llvovolume.h   |  4 ++--
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index eb8ff29acac..367d8e328d5 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -230,7 +230,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re
 
 	mMediaImplList.resize(getNumTEs());
 	mLastFetchedMediaVersion = -1;
-    mServerVolumeUpdateCount = 0;
+    mServerDrawableUpdateCount = 0;
 	memset(&mIndexInTex, 0, sizeof(S32) * LLRender::NUM_VOLUME_TEXTURE_CHANNELS);
 	mMDCImplCount = 0;
 	mLastRiggingInfoLOD = -1;
@@ -388,6 +388,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
                     }
 
 					gPipeline.markTextured(mDrawable);
+                    onDrawableUpdateFromServer();
 					mFaceMappingChanged = TRUE;
 					mTexAnimMode = 0;
 				}
@@ -401,7 +402,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
 			if (setVolume(volume_params, 0))
 			{
 				markForUpdate(TRUE);
-                onVolumeUpdateFromServer();
+                onDrawableUpdateFromServer();
 			}
 		}
 
@@ -412,6 +413,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
 		//
 
 		S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, (S32) block_num);
+        onDrawableUpdateFromServer();
 		if (result & teDirtyBits)
 		{
 			updateTEData();
@@ -438,9 +440,10 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
 			if (setVolume(volume_params, 0))
 			{
 				markForUpdate(TRUE);
-                onVolumeUpdateFromServer();
+                onDrawableUpdateFromServer();
 			}
 			S32 res2 = unpackTEMessage(*dp);
+            onDrawableUpdateFromServer();
 			if (TEM_INVALID == res2)
 			{
 				// There's something bogus in the data that we're unpacking.
@@ -501,6 +504,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
                 }
 
 				gPipeline.markTextured(mDrawable);
+                onDrawableUpdateFromServer();
 				mFaceMappingChanged = TRUE;
 				mTexAnimMode = 0;
 			}
@@ -519,6 +523,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
 				LLDataPackerBinaryBuffer	tdp(tdpbuffer, 1024);
 				mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextureEntry, tdpbuffer, 0, block_num, 1024);
 				S32 result = unpackTEMessage(tdp);
+                onDrawableUpdateFromServer();
 				if (result & teDirtyBits)
 				{
 					updateTEData();
@@ -554,11 +559,15 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
 	return retval;
 }
 
-void LLVOVolume::onVolumeUpdateFromServer()
+// Called when a volume, material, etc is updated by the server, possibly by a
+// script. If this occurs too often for this object, mark it as active so that
+// it doesn't disrupt the octree/render batches, thereby potentially causing a
+// big performance penalty.
+void LLVOVolume::onDrawableUpdateFromServer()
 {
     constexpr U32 UPDATES_UNTIL_ACTIVE = 8;
-    ++mServerVolumeUpdateCount;
-    if (mDrawable && !mDrawable->isActive() && mServerVolumeUpdateCount > UPDATES_UNTIL_ACTIVE)
+    ++mServerDrawableUpdateCount;
+    if (mDrawable && !mDrawable->isActive() && mServerDrawableUpdateCount > UPDATES_UNTIL_ACTIVE)
     {
         mDrawable->makeActive();
     }
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 66c87494df6..71ac1524909 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -170,7 +170,6 @@ class LLVOVolume : public LLViewerObject
 				const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const;
 
 				void	markForUpdate(BOOL priority);
-                void    onVolumeUpdateFromServer();
 				void	markForUnload()							{ LLViewerObject::markForUnload(TRUE); mVolumeChanged = TRUE; }
 				void    faceMappingChanged()                    { mFaceMappingChanged=TRUE; };
 
@@ -387,6 +386,7 @@ class LLVOVolume : public LLViewerObject
 	static S32 mRenderComplexity_last;
 	static S32 mRenderComplexity_current;
 
+    void onDrawableUpdateFromServer();
 	void requestMediaDataUpdate(bool isNew);
 	void cleanUpMediaImpls();
 	void addMediaImpl(LLViewerMediaImpl* media_impl, S32 texture_index) ;
@@ -425,7 +425,7 @@ class LLVOVolume : public LLViewerObject
 	LLPointer<LLViewerFetchedTexture> mLightTexture;
 	media_list_t mMediaImplList;
 	S32			mLastFetchedMediaVersion; // as fetched from the server, starts as -1
-    U64         mServerVolumeUpdateCount;
+    U64         mServerDrawableUpdateCount;
 	S32 mIndexInTex[LLRender::NUM_VOLUME_TEXTURE_CHANNELS];
 	S32 mMDCImplCount;
 
-- 
GitLab