summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorCosmic Linden <cosmic@lindenlab.com>2022-07-08 16:25:21 -0700
committerCosmic Linden <cosmic@lindenlab.com>2022-07-12 15:53:38 -0700
commit0aaf52c77c6c65258ca580557b6fd0766011471c (patch)
tree5c86076f223ad178145688e723783ae2742a2688 /indra/newview
parent0c3149eb7dbcf484f13f511e7d9f137636ad1ea8 (diff)
SL-17691: Make objects active if there are too many material updates from the server
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llvovolume.cpp21
-rw-r--r--indra/newview/llvovolume.h4
2 files changed, 17 insertions, 8 deletions
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index eb8ff29aca..367d8e328d 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 66c87494df..71ac152490 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -170,7 +170,6 @@ public:
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 @@ protected:
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 @@ private:
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;