From 460d3ddcb26bdc1095c192d5a0b7669cf1120a31 Mon Sep 17 00:00:00 2001 From: Cosmic Linden 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 946cb70dc8..bf404c03f8 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -247,7 +247,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; @@ -409,6 +409,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, } gPipeline.markTextured(mDrawable); + onDrawableUpdateFromServer(); mFaceMappingChanged = TRUE; mTexAnimMode = 0; } @@ -448,7 +449,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, if (setVolume(volume_params, 0)) { markForUpdate(TRUE); - onVolumeUpdateFromServer(); + onDrawableUpdateFromServer(); } } @@ -483,6 +484,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, } } // + onDrawableUpdateFromServer(); if (result & teDirtyBits) { updateTEData(); @@ -535,9 +537,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. @@ -618,6 +621,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, } gPipeline.markTextured(mDrawable); + onDrawableUpdateFromServer(); mFaceMappingChanged = TRUE; mTexAnimMode = 0; } @@ -636,6 +640,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(); @@ -674,11 +679,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 8eba0f9cab..e48e698a38 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -175,7 +175,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; }; @@ -392,6 +391,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) ; @@ -435,7 +435,7 @@ private: LLPointer 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;