diff options
| author | Oz Linden <oz@lindenlab.com> | 2011-11-08 15:07:45 -0500 | 
|---|---|---|
| committer | Oz Linden <oz@lindenlab.com> | 2011-11-08 15:07:45 -0500 | 
| commit | 89b75e75315592da9f4aac2ed851b61f1ac20851 (patch) | |
| tree | 80e8466a755f7ecc86a9a3834fc6d5777fa5fc48 | |
| parent | 22dd6acbc969f604c120a9ca06cfbef6eb8d29a4 (diff) | |
| parent | 02554b74827bdade4b8e3f23c4e7325ddd347040 (diff) | |
merge changes for vmrg-181
| -rw-r--r-- | indra/llcommon/llmemory.cpp | 22 | ||||
| -rw-r--r-- | indra/llcommon/llmemory.h | 8 | ||||
| -rw-r--r-- | indra/llwindow/llwindowwin32.cpp | 8 | ||||
| -rwxr-xr-x | indra/newview/llappviewer.cpp | 7 | ||||
| -rw-r--r-- | indra/newview/llappviewerwin32.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/lltexturecache.cpp | 7 | ||||
| -rw-r--r-- | indra/newview/llviewermedia.cpp | 70 | ||||
| -rw-r--r-- | indra/newview/llviewertexture.cpp | 47 | ||||
| -rw-r--r-- | indra/newview/llviewertexture.h | 1 | ||||
| -rw-r--r-- | indra/newview/llviewertexturelist.cpp | 28 | 
10 files changed, 147 insertions, 55 deletions
| diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index 4db1b8bd10..bb7998c0a8 100644 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -1821,6 +1821,7 @@ void LLPrivateMemoryPool::LLChunkHashElement::remove(LLPrivateMemoryPool::LLMemo  //class LLPrivateMemoryPoolManager  //--------------------------------------------------------------------  LLPrivateMemoryPoolManager* LLPrivateMemoryPoolManager::sInstance = NULL ; +BOOL LLPrivateMemoryPoolManager::sPrivatePoolEnabled = FALSE ;  std::vector<LLPrivateMemoryPool*> LLPrivateMemoryPoolManager::sDanglingPoolList ;  LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled, U32 max_pool_size)  @@ -1832,7 +1833,7 @@ LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled, U32 max_poo  		mPoolList[i] = NULL ;  	} -	mPrivatePoolEnabled = enabled ; +	sPrivatePoolEnabled = enabled ;  	const U32 MAX_POOL_SIZE = 256 * 1024 * 1024 ; //256 MB  	mMaxPrivatePoolSize = llmax(max_pool_size, MAX_POOL_SIZE) ; @@ -1917,7 +1918,7 @@ void LLPrivateMemoryPoolManager::destroyClass()  LLPrivateMemoryPool* LLPrivateMemoryPoolManager::newPool(S32 type)   { -	if(!mPrivatePoolEnabled) +	if(!sPrivatePoolEnabled)  	{  		return NULL ;  	} @@ -2015,7 +2016,11 @@ void  LLPrivateMemoryPoolManager::freeMem(LLPrivateMemoryPool* poolp, void* addr  	}  	else  	{ -		if(!sInstance) //the private memory manager is destroyed, try the dangling list +		if(!sPrivatePoolEnabled) +		{ +			free(addr) ; //private pool is disabled. +		} +		else if(!sInstance) //the private memory manager is destroyed, try the dangling list  		{  			for(S32 i = 0 ; i < sDanglingPoolList.size(); i++)  			{ @@ -2036,12 +2041,13 @@ void  LLPrivateMemoryPoolManager::freeMem(LLPrivateMemoryPool* poolp, void* addr  					addr = NULL ;  					break ;  				} -			} +			}		 +			llassert_always(!addr) ; //addr should be release before hitting here! +		} +		else +		{ +			llerrs << "private pool is used before initialized.!" << llendl ;  		} - -		llassert_always(!addr) ; //addr should be release before hitting here! - -		free(addr) ;  	}	  } diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 74cf42c894..bbbdaa6497 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -394,12 +394,12 @@ public:  	LLPrivateMemoryPool* newPool(S32 type) ;  	void deletePool(LLPrivateMemoryPool* pool) ; -private: -	static LLPrivateMemoryPoolManager* sInstance ; -	std::vector<LLPrivateMemoryPool*> mPoolList ; -	BOOL mPrivatePoolEnabled; +private:	 +	std::vector<LLPrivateMemoryPool*> mPoolList ;	  	U32  mMaxPrivatePoolSize; +	static LLPrivateMemoryPoolManager* sInstance ; +	static BOOL sPrivatePoolEnabled;  	static std::vector<LLPrivateMemoryPool*> sDanglingPoolList ;  public:  	//debug and statistics info. diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 121c7880df..db5e55019b 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -1031,6 +1031,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  		mhInstance,  		NULL); +	LL_INFOS("Window") << "window is created." << llendl ; +  	//-----------------------------------------------------------------------  	// Create GL drawing context  	//----------------------------------------------------------------------- @@ -1120,6 +1122,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  		return FALSE;  	} +	LL_INFOS("Window") << "Drawing context is created." << llendl ; +  	gGLManager.initWGL();  	if (wglChoosePixelFormatARB) @@ -1256,7 +1260,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  			LL_INFOS("Window") << "Choosing pixel formats: " << num_formats << " pixel formats returned" << LL_ENDL;  		} -		 +		LL_INFOS("Window") << "pixel formats done." << llendl ;  		S32 swap_method = 0;  		S32 cur_format = num_formats-1; @@ -1306,6 +1310,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  			mhInstance,  			NULL); +		LL_INFOS("Window") << "recreate window done." << llendl ; +  		if (!(mhDC = GetDC(mWindowHandle)))  		{  			close(); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index dc88c81d6a..c937f604fc 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1970,6 +1970,8 @@ bool LLAppViewer::initThreads()  	static const bool enable_threads = true;  #endif +	LLImage::initClass(); +  	LLVFSThread::initClass(enable_threads && false);  	LLLFSThread::initClass(enable_threads && false); @@ -1979,8 +1981,7 @@ bool LLAppViewer::initThreads()  	LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(),  													sImageDecodeThread,  													enable_threads && true, -													app_metrics_qa_mode); -	LLImage::initClass(); +													app_metrics_qa_mode);	  	if (LLFastTimer::sLog || LLFastTimer::sMetricLog)  	{ @@ -3084,6 +3085,8 @@ void LLAppViewer::handleViewerCrash()  	llinfos << "Last render pool type: " << LLPipeline::sCurRenderPoolType << llendl ; +	LLMemory::logMemoryInfo(true) ; +  	//print out recorded call stacks if there are any.  	LLError::LLCallStacks::print(); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index f94c843ad9..647ace7ee3 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -403,11 +403,9 @@ bool LLAppViewerWin32::initHardwareTest()  	//  	if (FALSE == gSavedSettings.getBOOL("NoHardwareProbe"))  	{ -		BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup"); -  		// per DEV-11631 - disable hardware probing for everything  		// but vram. -		vram_only = TRUE; +		BOOL vram_only = TRUE;  		LLSplashScreen::update(LLTrans::getString("StartupDetectingHardware")); diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 70b0a31308..e7a176f4f9 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1641,8 +1641,8 @@ void LLTextureCache::purgeTextures(bool validate)  		{  			purge_count++;  	 		LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL; -			removeEntry(idx, entries[idx], filename) ;  			cache_size -= entries[idx].mBodySize; +			removeEntry(idx, entries[idx], filename) ;			  		}  	} @@ -1879,13 +1879,12 @@ void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename)  			  file_maybe_exists = false;  		  }  		} +		mTexturesSizeTotal -= entry.mBodySize;  		entry.mImageSize = -1;  		entry.mBodySize = 0;  		mHeaderIDMap.erase(entry.mID); -		mTexturesSizeMap.erase(entry.mID); - -		mTexturesSizeTotal -= entry.mBodySize; +		mTexturesSizeMap.erase(entry.mID);		  		mFreeList.insert(idx);	  	} diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 5afd481dda..ab9134dafa 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -2457,44 +2457,58 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask)  //////////////////////////////////////////////////////////////////////////////////////////  void LLViewerMediaImpl::updateJavascriptObject()  { +	static LLFrameTimer timer ; +  	if ( mMediaSource )  	{  		// flag to expose this information to internal browser or not.  		bool enable = gSavedSettings.getBOOL("BrowserEnableJSObject"); + +		if(!enable) +		{ +			return ; //no need to go further. +		} + +		if(timer.getElapsedTimeF32() < 1.0f) +		{ +			return ; //do not update more than once per second. +		} +		timer.reset() ; +  		mMediaSource->jsEnableObject( enable );  		// these values are only menaingful after login so don't set them before  		bool logged_in = LLLoginInstance::getInstance()->authSuccess();  		if ( logged_in )  		{ -		// current location within a region -		LLVector3 agent_pos = gAgent.getPositionAgent(); -		double x = agent_pos.mV[ VX ]; -		double y = agent_pos.mV[ VY ]; -		double z = agent_pos.mV[ VZ ]; -		mMediaSource->jsAgentLocationEvent( x, y, z ); - -		// current location within the grid -		LLVector3d agent_pos_global = gAgent.getLastPositionGlobal(); -		double global_x = agent_pos_global.mdV[ VX ]; -		double global_y = agent_pos_global.mdV[ VY ]; -		double global_z = agent_pos_global.mdV[ VZ ]; -		mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z ); - -		// current agent orientation -		double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] ); -		double angle = rotation * RAD_TO_DEG; -		if ( angle < 0.0f ) angle = 360.0f + angle;	// TODO: has to be a better way to get orientation! -		mMediaSource->jsAgentOrientationEvent( angle ); - -		// current region agent is in -		std::string region_name(""); -		LLViewerRegion* region = gAgent.getRegion(); -		if ( region ) -		{ -			region_name = region->getName(); -		}; -		mMediaSource->jsAgentRegionEvent( region_name ); +			// current location within a region +			LLVector3 agent_pos = gAgent.getPositionAgent(); +			double x = agent_pos.mV[ VX ]; +			double y = agent_pos.mV[ VY ]; +			double z = agent_pos.mV[ VZ ]; +			mMediaSource->jsAgentLocationEvent( x, y, z ); + +			// current location within the grid +			LLVector3d agent_pos_global = gAgent.getLastPositionGlobal(); +			double global_x = agent_pos_global.mdV[ VX ]; +			double global_y = agent_pos_global.mdV[ VY ]; +			double global_z = agent_pos_global.mdV[ VZ ]; +			mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z ); + +			// current agent orientation +			double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] ); +			double angle = rotation * RAD_TO_DEG; +			if ( angle < 0.0f ) angle = 360.0f + angle;	// TODO: has to be a better way to get orientation! +			mMediaSource->jsAgentOrientationEvent( angle ); + +			// current region agent is in +			std::string region_name(""); +			LLViewerRegion* region = gAgent.getRegion(); +			if ( region ) +			{ +				region_name = region->getName(); +			}; +			mMediaSource->jsAgentRegionEvent( region_name );  		}  		// language code the viewer is set to diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 280337be0f..786e2b73b1 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -417,6 +417,48 @@ const S32 min_non_tex_system_mem = (128<<20); // 128 MB  F32 texmem_lower_bound_scale = 0.85f;  F32 texmem_middle_bound_scale = 0.925f; +//static  +bool LLViewerTexture::isMemoryForTextureLow() +{ +	const static S32 MIN_FREE_TEXTURE_MEMORY = 5 ; //MB +	const static S32 MIN_FREE_MAIN_MEMORy = 100 ; //MB + +	bool low_mem = false ; +	if (gGLManager.mHasATIMemInfo) +	{ +		S32 meminfo[4]; +		glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo); + +		if(meminfo[0] / 1024 < MIN_FREE_TEXTURE_MEMORY) +		{ +			low_mem = true ; +		} +	} +#if 0  //ignore nVidia cards +	else if (gGLManager.mHasNVXMemInfo) +	{ +		S32 free_memory; +		glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory); +		 +		if(free_memory / 1024 < MIN_FREE_TEXTURE_MEMORY) +		{ +			low_mem = true ; +		} +	} +#endif + +	if(!low_mem) //check main memory, only works for windows. +	{ +		LLMemory::updateMemoryInfo() ; +		if(LLMemory::getAvailableMemKB() / 1024 < MIN_FREE_MAIN_MEMORy) +		{ +			low_mem = true ; +		} +	} + +	return low_mem ; +} +  //static  void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity)  { @@ -449,6 +491,11 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity  			sEvaluationTimer.reset();  		}  	} +	else if(sEvaluationTimer.getElapsedTimeF32() > discard_delta_time && isMemoryForTextureLow()) +	{ +		sDesiredDiscardBias += discard_bias_delta; +		sEvaluationTimer.reset(); +	}  	else if (sDesiredDiscardBias > 0.0f &&  			 BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) < sMaxBoundTextureMemInMegaBytes * texmem_lower_bound_scale &&  			 BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) < sMaxTotalTextureMemInMegaBytes * texmem_lower_bound_scale) diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index a4a5ae0a5b..b96441127d 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -267,6 +267,7 @@ private:  	/*virtual*/ LLImageGL* getGLTexture() const ;  	virtual void switchToCachedImage(); +	static bool isMemoryForTextureLow() ;  protected:  	LLUUID mID;  	S32 mBoostLevel;				// enum describing priority level diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index c64488251a..a48572f792 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -530,9 +530,11 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)  		}  		llerrs << "LLViewerTextureList::removeImageFromList - Image not in list" << llendl;  	} -	if(mImageList.erase(image) != 1)  + +	S32 count = mImageList.erase(image) ; +	if(count != 1)   	{ -		llerrs << "Error happens when remove image from mImageList!" << llendl ; +		llerrs << "Error happens when remove image from mImageList: " << count << llendl ;  	}  	image->setInImageList(FALSE) ; @@ -1053,6 +1055,13 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended)  		// Treat any card with < 32 MB (shudder) as having 32 MB  		//  - it's going to be swapping constantly regardless  		S32 max_vram = gGLManager.mVRAM; + +		if(gGLManager.mIsATI) +		{ +			//shrink the availabe vram for ATI cards because some of them do not handel texture swapping well. +			max_vram = (S32)(max_vram * 0.75f);   +		} +  		max_vram = llmax(max_vram, getMinVideoRamSetting());  		max_texmem = max_vram;  		if (!get_recommended) @@ -1060,10 +1069,19 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended)  	}  	else  	{ -		if (get_recommended) -			max_texmem = 128; -		else +		if (!get_recommended) +		{  			max_texmem = 512; +		} +		else if (gSavedSettings.getBOOL("NoHardwareProbe")) //did not do hardware detection at startup +		{ +			max_texmem = 512; +		} +		else +		{ +			max_texmem = 128; +		} +  		llwarns << "VRAM amount not detected, defaulting to " << max_texmem << " MB" << llendl;  	} | 
