diff options
| -rw-r--r-- | indra/llrender/llgltexture.h | 19 | ||||
| -rwxr-xr-x | indra/newview/llappearancemgr.cpp | 13 | ||||
| -rwxr-xr-x | indra/newview/llviewertexture.cpp | 4 | ||||
| -rwxr-xr-x | indra/newview/llviewertexture.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llvoavatar.cpp | 77 | ||||
| -rwxr-xr-x | indra/newview/llvoavatar.h | 3 | ||||
| -rwxr-xr-x | indra/newview/llvoavatarself.cpp | 127 | ||||
| -rwxr-xr-x | indra/newview/llvoavatarself.h | 2 | 
8 files changed, 218 insertions, 29 deletions
| diff --git a/indra/llrender/llgltexture.h b/indra/llrender/llgltexture.h index b1efe77519..e69b322d60 100644 --- a/indra/llrender/llgltexture.h +++ b/indra/llrender/llgltexture.h @@ -79,6 +79,15 @@ public:  		MAX_GL_IMAGE_CATEGORY  	}; +	typedef enum  +	{ +		DELETED = 0,         //removed from memory +		DELETION_CANDIDATE,  //ready to be removed from memory +		INACTIVE,            //not be used for the last certain period (i.e., 30 seconds). +		ACTIVE,              //just being used, can become inactive if not being used for a certain time (10 seconds). +		NO_DELETE = 99       //stay in memory, can not be removed. +	} LLGLTextureState; +  	static S32 getTotalNumOfCategories() ;  	static S32 getIndexFromCategory(S32 category) ;  	static S32 getCategoryFromIndex(S32 index) ; @@ -143,6 +152,8 @@ public:  	U32        getTexelsInGLTexture() const ;  	BOOL       isGLTextureCreated() const ;  	S32        getDiscardLevelInAtlas() const ; +	LLGLTextureState getTextureState() const { return mTextureState; } +	  	//---------------------------------------------------------------------------------------------  	//end of functions to access LLImageGL  	//--------------------------------------------------------------------------------------------- @@ -179,14 +190,6 @@ protected:  	S8 mDontDiscard;			// Keep full res version of this image (for UI, etc)  protected: -	typedef enum  -	{ -		DELETED = 0,         //removed from memory -		DELETION_CANDIDATE,  //ready to be removed from memory -		INACTIVE,            //not be used for the last certain period (i.e., 30 seconds). -		ACTIVE,              //just being used, can become inactive if not being used for a certain time (10 seconds). -		NO_DELETE = 99       //stay in memory, can not be removed. -	} LLGLTextureState;  	LLGLTextureState  mTextureState ; diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 4a484f3b85..bf35382b7a 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -155,6 +155,11 @@ LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id, const std::string  	}  } +// We want this to be much lower (e.g. 15.0 is usually fine), bumping +// up for now until we can diagnose some cases of very slow response +// to requests. +const F32 DEFAULT_RETRY_AFTER_INTERVAL = 300.0; +  class LLCallAfterInventoryBatchMgr: public LLEventTimer   {  public: @@ -162,7 +167,7 @@ public:  								 const std::string& phase_name,  								 nullary_func_t on_completion_func,  								 nullary_func_t on_failure_func = no_op, -								 F32 retry_after = 15.0, +								 F32 retry_after = DEFAULT_RETRY_AFTER_INTERVAL,  								 S32 max_retries = 2  		):  		mDstCatID(dst_cat_id), @@ -175,7 +180,7 @@ public:  		mFailCount(0),  		mCompletionOrFailureCalled(false),  		mRetryCount(0), -		LLEventTimer(retry_after) +		LLEventTimer(5.0)  	{  		if (!mTrackingPhase.empty())  		{ @@ -365,7 +370,7 @@ public:  								const std::string& phase_name,  								nullary_func_t on_completion_func,  								nullary_func_t on_failure_func = no_op, -								 F32 retry_after = 15.0, +								 F32 retry_after = DEFAULT_RETRY_AFTER_INTERVAL,  								 S32 max_retries = 2  		):  		LLCallAfterInventoryBatchMgr(dst_cat_id, phase_name, on_completion_func, on_failure_func, retry_after, max_retries) @@ -403,7 +408,7 @@ public:  								const std::string& phase_name,  								nullary_func_t on_completion_func,  								nullary_func_t on_failure_func = no_op, -								 F32 retry_after = 15.0, +								 F32 retry_after = DEFAULT_RETRY_AFTER_INTERVAL,  								 S32 max_retries = 2  		):  		LLCallAfterInventoryBatchMgr(dst_cat_id, phase_name, on_completion_func, on_failure_func, retry_after, max_retries) diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 846216211e..8eada5c2a1 100755 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -616,6 +616,7 @@ LLViewerTexture::LLViewerTexture(const LLImageRaw* raw, BOOL usemipmaps) :  LLViewerTexture::~LLViewerTexture()  { +	LL_DEBUGS("Avatar") << mID << llendl;  	cleanup();  	sImageCount--;  } @@ -1159,7 +1160,8 @@ void LLViewerFetchedTexture::destroyTexture()  	{  		return ;  	} -	 + +	LL_DEBUGS("Avatar") << mID << llendl;  	destroyGLTexture() ;  	mFullyLoaded = FALSE ;  } diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 3df942d922..ba6beec883 100755 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -134,6 +134,7 @@ public:  	void resetTextureStats();	  	void setMaxVirtualSizeResetInterval(S32 interval)const {mMaxVirtualSizeResetInterval = interval;}  	void resetMaxVirtualSizeResetCounter()const {mMaxVirtualSizeResetCounter = mMaxVirtualSizeResetInterval;} +	S32 getMaxVirtualSizeResetCounter() const { return mMaxVirtualSizeResetCounter; }  	virtual F32  getMaxVirtualSize() ; @@ -306,6 +307,7 @@ public:  	// the priority list, and cause horrible things to happen.  	void setDecodePriority(F32 priority = -1.0f);  	F32 getDecodePriority() const { return mDecodePriority; }; +	F32 getAdditionalDecodePriority() const { return mAdditionalDecodePriority; };  	void setAdditionalDecodePriority(F32 priority) ; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 117f28cc36..df0b8171a6 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -4004,8 +4004,81 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color, S32 diffuse_channel)  //------------------------------------------------------------------------  // LLVOAvatar::updateTextures()  //------------------------------------------------------------------------ +void LLVOAvatar::collectTextureUUIDs(std::set<LLUUID>& ids, S32& local_mem, S32& baked_mem) +{ +	for (U32 texture_index = 0; texture_index < getNumTEs(); texture_index++) +	{ +		LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)texture_index); +		U32 num_wearables = gAgentWearables.getWearableCount(wearable_type); + +		LLViewerFetchedTexture *imagep = NULL; +		for (U32 wearable_index = 0; wearable_index < num_wearables; wearable_index++) +		{ +			imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index, wearable_index), TRUE); +			if (imagep) +			{ +				const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)texture_index); +				if (texture_dict->mIsLocalTexture) +				{ +					local_mem += imagep->getTextureMemory(); +					ids.insert(imagep->getID()); +				} +			} +		} +		if (isIndexBakedTexture((ETextureIndex) texture_index)) +		{ +			imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index,0), TRUE); +			if (imagep) +			{ +				baked_mem += imagep->getTextureMemory(); +				ids.insert(imagep->getID()); +			} +		} +	} +	ids.erase(IMG_DEFAULT); +	ids.erase(IMG_DEFAULT_AVATAR); +	ids.erase(IMG_INVISIBLE); +} + +void LLVOAvatar::releaseOldTextures() +{ +	S32 current_texture_mem = 0; +	 +	// Any textures that we used to be using but are no longer using should no longer be flagged as "NO_DELETE" +	std::set<LLUUID> new_texture_ids; +	S32 local_mem = 0, baked_mem = 0; +	collectTextureUUIDs(new_texture_ids, local_mem, baked_mem); +	LL_DEBUGS("Avatar") << getFullname() << " local_mem: " << local_mem << " baked_mem: " << baked_mem << llendl;   +	for (std::set<LLUUID>::iterator it = mTextureIDs.begin(); it != mTextureIDs.end(); ++it) +	{ +		if (new_texture_ids.find(*it) == new_texture_ids.end()) +		{ +			LLViewerFetchedTexture *imagep = gTextureList.findImage(*it); +			if (imagep) +			{ +				current_texture_mem += imagep->getTextureMemory(); +				if (imagep->getTextureState() == LLGLTexture::NO_DELETE) +				{ +					// This will allow the texture to be deleted if not in use. +					imagep->forceActive(); + +					// This resets the clock to being flagged as +					// unused, preventing the texture from being +					// deleted immediately. If other avatars or +					// objects are using it, it can still be flagged +					// no-delete by them. +					imagep->forceUpdateBindStats(); +				} +			} +		} +	} +	mTextureIDs = new_texture_ids; +} +  void LLVOAvatar::updateTextures()  { +	releaseOldTextures(); +	  	BOOL render_avatar = TRUE;  	if (mIsDummy) @@ -5811,6 +5884,7 @@ void LLVOAvatar::debugColorizeSubMeshes(U32 i, const LLColor4& color)  // virtual  void LLVOAvatar::updateMeshTextures()  { +	static S32 update_counter = 0;  	mBakedTextureDebugText.clear();  	// if user has never specified a texture, assign the default @@ -5840,7 +5914,8 @@ void LLVOAvatar::updateMeshTextures()  	std::vector<BOOL> use_lkg_baked_layer; // lkg = "last known good"  	use_lkg_baked_layer.resize(mBakedTextureDatas.size(), false); -	mBakedTextureDebugText +=          "indx layerset linvld ltda ilb ulkg ltid\n"; +	mBakedTextureDebugText += llformat("%06d\n",update_counter++); +	mBakedTextureDebugText += "indx layerset linvld ltda ilb ulkg ltid\n";  	for (U32 i=0; i < mBakedTextureDatas.size(); i++)  	{  		is_layer_baked[i] = isTextureDefined(mBakedTextureDatas[i].mTextureIndex); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 4802476e59..5b1395e566 100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -134,6 +134,8 @@ public:  	BOOL  	 	 	 	 	updateJointLODs();  	void					updateLODRiggedAttachments( void );  	/*virtual*/ BOOL   	 	 	isActive() const; // Whether this object needs to do an idleUpdate. +	void 						collectTextureUUIDs(std::set<LLUUID>& ids, S32& local_mem, S32& baked_mem); +	void						releaseOldTextures();  	/*virtual*/ void   	 	 	updateTextures();  	/*virtual*/ S32    	 	 	setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim.  	/*virtual*/ void   	 	 	onShift(const LLVector4a& shift_vector); @@ -528,6 +530,7 @@ protected:  	LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;   	BOOL mLoadedCallbacksPaused; +	std::set<LLUUID>	mTextureIDs;  	//--------------------------------------------------------------------  	// Local Textures  	//-------------------------------------------------------------------- diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 77deb5e3bc..41dfe51116 100755 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -176,6 +176,17 @@ LLVOAvatarSelf::LLVOAvatarSelf(const LLUUID& id,  	lldebugs << "Marking avatar as self " << id << llendl;  } +// Called periodically for diagnostics, return true when done. +bool output_self_av_texture_diagnostics() +{ +	if (!isAgentAvatarValid()) +		return true; // done checking + +	gAgentAvatarp->outputRezDiagnostics(); + +	return false; +} +  void LLVOAvatarSelf::initInstance()  {  	BOOL status = TRUE; @@ -209,6 +220,8 @@ void LLVOAvatarSelf::initInstance()  		llerrs << "Unable to load user's avatar" << llendl;  		return;  	} + +	doPeriodically(output_self_av_texture_diagnostics, 30.0);  }  // virtual @@ -2008,6 +2021,83 @@ void LLVOAvatarSelf::debugBakedTextureUpload(EBakedTextureIndex index, BOOL fini  	mDebugBakedTextureTimes[index][done] = mDebugSelfLoadTimer.getElapsedTimeF32();  } +const std::string LLVOAvatarSelf::verboseDebugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const +{ +	std::ostringstream outbuf; +	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = +			 LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); +		 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +		 ++baked_iter) +	{ +		const EBakedTextureIndex baked_index = baked_iter->first; +		if (layerset == mBakedTextureDatas[baked_index].mTexLayerSet) +		{ +			outbuf << "baked_index: " << baked_index << "\n"; +			const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second; +			for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin(); +				 local_tex_iter != baked_dict->mLocalTextures.end(); +				 ++local_tex_iter) +			{ +				const ETextureIndex tex_index = *local_tex_iter; +				const std::string tex_name = LLAvatarAppearanceDictionary::getInstance()->getTexture(tex_index)->mName; +				outbuf << "  tex_index " << (S32) tex_index << " name " << tex_name << "\n"; +				const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); +				const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); +				if (wearable_count > 0) +				{ +					for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++) +					{ +						outbuf << "    " << LLWearableType::getTypeName(wearable_type) << " " << wearable_index << ":"; +						const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(tex_index, wearable_index); +						if (local_tex_obj) +						{ +							LLViewerFetchedTexture* image = dynamic_cast<LLViewerFetchedTexture*>( local_tex_obj->getImage() ); +							if (tex_index >= 0 +								&& local_tex_obj->getID() != IMG_DEFAULT_AVATAR +								&& !image->isMissingAsset()) +							{ +								outbuf << " id: " << image->getID() +									   << " refs: " << image->getNumRefs() +									   << " glocdisc: " << getLocalDiscardLevel(tex_index, wearable_index) +									   << " discard: " << image->getDiscardLevel() +									   << " desired: " << image->getDesiredDiscardLevel() +									   << " decode: " << image->getDecodePriority() +									   << " addl: " << image->getAdditionalDecodePriority() +									   << " ts: " << image->getTextureState() +									   << " bl: " << image->getBoostLevel() +									   << " fl: " << image->isFullyLoaded() // this is not an accessor for mFullyLoaded - see comment there. +									   << " mvs: " << image->getMaxVirtualSize() +									   << " mvsc: " << image->getMaxVirtualSizeResetCounter() +									   << " mem: " << image->getTextureMemory(); +							} +						} +						outbuf << "\n"; +					} +				} +			} +			break; +		} +	} +	return outbuf.str(); +} + +void LLVOAvatarSelf::dumpAllTextures() const +{ +	std::string vd_text = "Local textures per baked index and wearable:\n"; +	for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); +		 baked_iter != LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +		 ++baked_iter) +	{ +		const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first; +		const LLViewerTexLayerSet *layerset = debugGetLayerSet(baked_index); +		if (!layerset) continue; +		const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite(); +		if (!layerset_buffer) continue; +		vd_text += verboseDebugDumpLocalTextureDataInfo(layerset); +	} +	LL_DEBUGS("Avatar") << vd_text << llendl; +} +  const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const  {  	std::string text=""; @@ -2277,23 +2367,28 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe  {  	if (!isIndexLocalTexture(type)) return; -	if (getLocalTextureID(type, index) != IMG_DEFAULT_AVATAR && imagep->getDiscardLevel() != 0) +	if (getLocalTextureID(type, index) != IMG_DEFAULT_AVATAR)  	{ -		F32 desired_pixels; -		desired_pixels = llmin(mPixelArea, (F32)getTexImageArea()); - -		if (isUsingLocalAppearance()) +		imagep->setNoDelete(); +		if (imagep->getDiscardLevel() != 0)  		{ -			imagep->setBoostLevel(getAvatarBoostLevel()); -			imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; -		} -		imagep->resetTextureStats(); -		imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); -		imagep->addTextureStats( desired_pixels / texel_area_ratio ); -		imagep->forceUpdateBindStats() ; -		if (imagep->getDiscardLevel() < 0) -		{ -			mHasGrey = TRUE; // for statistics gathering +			F32 desired_pixels; +			desired_pixels = llmin(mPixelArea, (F32)getTexImageArea()); + +			// DRANO what priority should wearable-based textures have? +			if (isUsingLocalAppearance()) +			{ +				imagep->setBoostLevel(getAvatarBoostLevel()); +				imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; +			} +			imagep->resetTextureStats(); +			imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); +			imagep->addTextureStats( desired_pixels / texel_area_ratio ); +			imagep->forceUpdateBindStats() ; +			if (imagep->getDiscardLevel() < 0) +			{ +				mHasGrey = TRUE; // for statistics gathering +			}  		}  	}  	else @@ -2466,6 +2561,8 @@ void LLVOAvatarSelf::outputRezDiagnostics() const  		if (!layerset_buffer) continue;  		LL_DEBUGS("Avatar") << layerset_buffer->dumpTextureInfo() << llendl;  	} + +	dumpAllTextures();  }  void LLVOAvatarSelf::outputRezTiming(const std::string& msg) const diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index eeac5ddaeb..74888e470d 100755 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -390,6 +390,8 @@ public:  	BOOL					isAllLocalTextureDataFinal() const;  	const LLViewerTexLayerSet*	debugGetLayerSet(LLAvatarAppearanceDefines::EBakedTextureIndex index) const { return (LLViewerTexLayerSet*)(mBakedTextureDatas[index].mTexLayerSet); } +	const std::string		verboseDebugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const; // Lists out state of this particular baked texture layer +	void					dumpAllTextures() const;  	const std::string		debugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const; // Lists out state of this particular baked texture layer  	const std::string		debugDumpAllLocalTextureDataInfo() const; // Lists out which baked textures are at highest LOD  	LLSD					metricsData(); | 
