diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llkdu/llimagej2ckdu.cpp | 4 | ||||
| -rw-r--r-- | indra/llkdu/llimagej2ckdu.h | 1 | ||||
| -rw-r--r-- | indra/llkdu/llkdumem.h | 1 | ||||
| -rw-r--r-- | indra/llkdu/tests/llimagej2ckdu_test.cpp | 20 | ||||
| -rwxr-xr-x | indra/newview/app_settings/settings.xml | 66 | ||||
| -rw-r--r-- | indra/newview/llviewertexturelist.cpp | 66 | 
6 files changed, 126 insertions, 32 deletions
| diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index cf88de12b4..0c0a844b73 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -1179,7 +1179,7 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap)  			llassert(mDims == comp_dims); // Safety check; the caller has ensured this  		}  		bool use_shorts = (mComps[c].get_bit_depth(true) <= 16); -		mLines[c].pre_create(&mAllocator,mDims.size.x,mReversible[c],use_shorts); +		mLines[c].pre_create(&mAllocator,mDims.size.x,mReversible[c],use_shorts,0,0);  		if (res.which() == 0) // No DWT levels used  		{  			mEngines[c] = kdu_decoder(res.access_subband(LL_BAND),&mAllocator,use_shorts); @@ -1223,7 +1223,7 @@ separation between consecutive rows in the real buffer. */  	{  		for (c = 0; c < mNumComponents; c++)  		{ -			mEngines[c].pull(mLines[c],true); +			mEngines[c].pull(mLines[c]);  		}  		if ((mNumComponents >= 3) && mUseYCC)  		{ diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h index 9ab0b9e4a7..fb1f6535ba 100644 --- a/indra/llkdu/llimagej2ckdu.h +++ b/indra/llkdu/llimagej2ckdu.h @@ -32,6 +32,7 @@  //  // KDU core header files  // +#define KDU_NO_THREADS  #include "kdu_elementary.h"  #include "kdu_messaging.h"  #include "kdu_params.h" diff --git a/indra/llkdu/llkdumem.h b/indra/llkdu/llkdumem.h index 9d923fc367..dbdf88b2d9 100644 --- a/indra/llkdu/llkdumem.h +++ b/indra/llkdu/llkdumem.h @@ -28,6 +28,7 @@  #define LL_LLKDUMEM_H  // Support classes for reading and writing from memory buffers in KDU +#define KDU_NO_THREADS  #include "kdu_image.h"  #include "kdu_elementary.h"  #include "kdu_messaging.h" diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp index beee99a522..e66476a913 100644 --- a/indra/llkdu/tests/llimagej2ckdu_test.cpp +++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp @@ -127,7 +127,7 @@ kdu_subband kdu_resolution::access_subband(int ) { kdu_subband a; return a; }  void kdu_resolution::get_dims(kdu_dims& ) { }  int kdu_resolution::which() { return 0; }  int kdu_resolution::get_valid_band_indices(int &) { return 1; } -kdu_decoder::kdu_decoder(kdu_subband , kdu_sample_allocator*, bool , float, int, kdu_thread_env*, kdu_thread_queue*) { } +//kdu_decoder::kdu_decoder(kdu_subband , kdu_sample_allocator*, bool , float, int, kdu_thread_env*, kdu_thread_queue*) { }  kdu_synthesis::kdu_synthesis(kdu_resolution, kdu_sample_allocator*, bool, float, kdu_thread_env*, kdu_thread_queue*) { }  kdu_params::kdu_params(const char*, bool, bool, bool, bool, bool) { }  kdu_params::~kdu_params() { } @@ -153,7 +153,6 @@ void kdu_codestream::destroy() { }  void kdu_codestream::collect_timing_stats(int ) { }  void kdu_codestream::set_max_bytes(kdu_long, bool, bool ) { }  void kdu_codestream::get_valid_tiles(kdu_dims& ) { } -void kdu_codestream::create(siz_params*, kdu_compressed_target*, kdu_dims*, int, kdu_long ) { }  void kdu_codestream::create(kdu_compressed_source*, kdu_thread_env*) { }  void kdu_codestream::apply_input_restrictions( int, int, int, int, kdu_dims*, kdu_component_access_mode ) { }  void kdu_codestream::get_subsampling(int , kdu_coords&, bool ) { } @@ -175,7 +174,7 @@ kdu_block* kdu_subband::open_block(kdu_coords, int*, kdu_thread_env*) { return N  bool kdu_codestream_comment::put_text(const char*) { return false; }  void kdu_customize_warnings(kdu_message*) { }  void kdu_customize_errors(kdu_message*) { } -void kdu_convert_ycc_to_rgb(kdu_line_buf&, kdu_line_buf&, kdu_line_buf&, int) { } +  kdu_long kdu_multi_analysis::create(kdu_codestream, kdu_tile, bool, kdu_roi_image*, bool, int, kdu_thread_env*, kdu_thread_queue*, bool ) { kdu_long a = 0; return a; }  siz_params::siz_params() : kdu_params(NULL, false, false, false, false, false) { }  void siz_params::finalize(bool ) { } @@ -184,6 +183,21 @@ int siz_params::write_marker_segment(kdu_output*, kdu_params*, int) { return 0;  bool siz_params::check_marker_segment(kdu_uint16, int, kdu_byte a[], int&) { return false; }  bool siz_params::read_marker_segment(kdu_uint16, int, kdu_byte a[], int) { return false; } +#ifdef LL_LINUX +// Linux use the old pre KDU v7.0.0 +// *TODO: Supress this legacy stubbs once Linux migrates to v7.0.0 +kdu_decoder::kdu_decoder(kdu_subband , kdu_sample_allocator*, bool , float, int, kdu_thread_env*, kdu_thread_queue*) { } +void kdu_codestream::create(siz_params*, kdu_compressed_target*, kdu_dims*, int, kdu_long ) { } +void kdu_convert_ycc_to_rgb(kdu_line_buf&, kdu_line_buf&, kdu_line_buf&, int) { } +#else +kdu_decoder::kdu_decoder(kdu_subband , kdu_sample_allocator*, bool , float, int, kdu_thread_env*, kdu_thread_queue*, int) { } +void kdu_codestream::create(siz_params*, kdu_compressed_target*, kdu_dims*, int, kdu_long, kdu_thread_env* ) { } +void (*kdu_convert_ycc_to_rgb_rev16)(kdu_int16*,kdu_int16*,kdu_int16*,int); +void (*kdu_convert_ycc_to_rgb_irrev16)(kdu_int16*,kdu_int16*,kdu_int16*,int); +void (*kdu_convert_ycc_to_rgb_rev32)(kdu_int32*,kdu_int32*,kdu_int32*,int); +void (*kdu_convert_ycc_to_rgb_irrev32)(float*,float*,float*,int); +#endif +  // -------------------------------------------------------------------------------------------  // TUT  // ------------------------------------------------------------------------------------------- diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 47f37d7d3e..5fe51c97c5 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10752,6 +10752,72 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>TextureFetchUpdateHighPriority</key> +    <map> +      <key>Comment</key> +      <string>Number of high priority textures to update per frame</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>32</integer> +    </map> +    <key>TextureFetchUpdateMaxMediumPriority</key> +    <map> +      <key>Comment</key> +      <string>Maximum number of medium priority textures to update per frame</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>256</integer> +    </map> +    <key>TextureFetchUpdateMinMediumPriority</key> +    <map> +      <key>Comment</key> +      <string>Minimum number of medium priority textures to update per frame</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>32</integer> +    </map> +    <key>TextureFetchUpdatePriorityThreshold</key> +    <map> +      <key>Comment</key> +      <string>Threshold under which textures will be considered too low priority and skipped for update</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <integer>0.0</integer> +    </map> +    <key>TextureFetchUpdateSkipLowPriority</key> +    <map> +      <key>Comment</key> +      <string>Flag indicating if we want to skip textures with too low of a priority</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>TextureFetchUpdatePriorities</key> +    <map> +      <key>Comment</key> +      <string>Number of priority texture to update per frame</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>32</integer> +    </map>      <key>TextureLoadFullRes</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index c8082d60bd..42d8cb9272 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -693,10 +693,11 @@ void LLViewerTextureList::updateImagesDecodePriorities()  {  	// Update the decode priority for N images each frame  	{ -		const size_t max_update_count = llmin((S32) (1024*gFrameIntervalSeconds) + 1, 32); //target 1024 textures per second -		S32 update_counter = llmin(max_update_count, mUUIDMap.size()/10); +        static const S32 MAX_PRIO_UPDATES = gSavedSettings.getS32("TextureFetchUpdatePriorities");         // default: 32 +		const size_t max_update_count = llmin((S32) (MAX_PRIO_UPDATES*MAX_PRIO_UPDATES*gFrameIntervalSeconds) + 1, MAX_PRIO_UPDATES); +		S32 update_counter = llmin(max_update_count, mUUIDMap.size());  		uuid_map_t::iterator iter = mUUIDMap.upper_bound(mLastUpdateUUID); -		while(update_counter > 0 && !mUUIDMap.empty()) +		while ((update_counter-- > 0) && !mUUIDMap.empty())  		{  			if (iter == mUUIDMap.end())  			{ @@ -704,7 +705,7 @@ void LLViewerTextureList::updateImagesDecodePriorities()  			}  			mLastUpdateUUID = iter->first;  			LLPointer<LLViewerFetchedTexture> imagep = iter->second; -			++iter; // safe to incrament now +			++iter; // safe to increment now  			if(imagep->isInDebug())  			{ @@ -784,7 +785,6 @@ void LLViewerTextureList::updateImagesDecodePriorities()  				imagep->setDecodePriority(decode_priority);  				mImageList.insert(imagep);  			} -			update_counter--;  		}  	}  } @@ -887,15 +887,24 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)  {  	LLTimer image_op_timer; -	// Update the decode priority for N images each frame -	// Make a list with 32 high priority entries + 256 cycled entries -	const size_t max_priority_count = llmin((S32) (256*10.f*gFrameIntervalSeconds)+1, 32); -	const size_t max_update_count = llmin((S32) (1024*10.f*gFrameIntervalSeconds)+1, 256); +	// Update fetch for N images each frame +	static const S32 MAX_HIGH_PRIO_COUNT = gSavedSettings.getS32("TextureFetchUpdateHighPriority");         // default: 32 +	static const S32 MAX_UPDATE_COUNT = gSavedSettings.getS32("TextureFetchUpdateMaxMediumPriority");       // default: 256 +	static const S32 MIN_UPDATE_COUNT = gSavedSettings.getS32("TextureFetchUpdateMinMediumPriority");       // default: 32 +	static const F32 MIN_PRIORITY_THRESHOLD = gSavedSettings.getF32("TextureFetchUpdatePriorityThreshold"); // default: 0.0 +	static const bool SKIP_LOW_PRIO = gSavedSettings.getBOOL("TextureFetchUpdateSkipLowPriority");          // default: false + +	size_t max_priority_count = llmin((S32) (MAX_HIGH_PRIO_COUNT*MAX_HIGH_PRIO_COUNT*gFrameIntervalSeconds)+1, MAX_HIGH_PRIO_COUNT); +	max_priority_count = llmin(max_priority_count, mImageList.size()); +	 +	size_t total_update_count = mUUIDMap.size(); +	size_t max_update_count = llmin((S32) (MAX_UPDATE_COUNT*MAX_UPDATE_COUNT*gFrameIntervalSeconds)+1, MAX_UPDATE_COUNT); +	max_update_count = llmin(max_update_count, total_update_count);	 -	// 32 high priority entries +	// MAX_HIGH_PRIO_COUNT high priority entries  	typedef std::vector<LLViewerFetchedTexture*> entries_list_t;  	entries_list_t entries; -	size_t update_counter = llmin(max_priority_count, mImageList.size()); +	size_t update_counter = max_priority_count;  	image_priority_list_t::iterator iter1 = mImageList.begin();  	while(update_counter > 0)  	{ @@ -905,43 +914,46 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)  		update_counter--;  	} -	// 256 cycled entries -	update_counter = llmin(max_update_count, mUUIDMap.size());	 +	// MAX_UPDATE_COUNT cycled entries +	update_counter = max_update_count;	  	if(update_counter > 0)  	{  		uuid_map_t::iterator iter2 = mUUIDMap.upper_bound(mLastFetchUUID); -		uuid_map_t::iterator iter2p = iter2; -		while(update_counter > 0) +		while ((update_counter > 0) && (total_update_count > 0))  		{  			if (iter2 == mUUIDMap.end())  			{  				iter2 = mUUIDMap.begin();  			} -			entries.push_back(iter2->second); -			iter2p = iter2++; -			update_counter--; +			LLViewerFetchedTexture* imagep = iter2->second; +            // Skip the textures where there's really nothing to do so to give some times to others. Also skip the texture if it's already in the high prio set. +            if (!SKIP_LOW_PRIO || (SKIP_LOW_PRIO && ((imagep->getDecodePriority() > MIN_PRIORITY_THRESHOLD) || imagep->hasFetcher()))) +            { +                entries.push_back(imagep); +                update_counter--; +            } + +			iter2++; +			total_update_count--;  		} - -		mLastFetchUUID = iter2p->first;  	}  	S32 fetch_count = 0; -	S32 min_count = max_priority_count + max_update_count/4; +	size_t min_update_count = llmin(MIN_UPDATE_COUNT,(S32)(entries.size()-max_priority_count)); +	S32 min_count = max_priority_count + min_update_count;  	for (entries_list_t::iterator iter3 = entries.begin();  		 iter3 != entries.end(); )  	{  		LLViewerFetchedTexture* imagep = *iter3++; -		 -		bool fetching = imagep->updateFetch(); -		if (fetching) +		fetch_count += (imagep->updateFetch() ? 1 : 0); +		if (min_count <= min_update_count)  		{ -			fetch_count++; +			mLastFetchUUID = imagep->getID();  		} -		if (min_count <= 0 && image_op_timer.getElapsedTimeF32() > max_time) +		if ((min_count-- <= 0) && (image_op_timer.getElapsedTimeF32() > max_time))  		{  			break;  		} -		min_count--;  	}  	//if (fetch_count == 0)  	//{ | 
