diff options
| -rwxr-xr-x | autobuild.xml | 1 | ||||
| -rw-r--r-- | indra/newview/llmaterialmgr.cpp | 47 | ||||
| -rw-r--r-- | indra/newview/llmaterialmgr.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llviewerregion.cpp | 44 | ||||
| -rwxr-xr-x | indra/newview/llviewerregion.h | 9 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_tools_texture.xml | 8 | 
6 files changed, 72 insertions, 39 deletions
| diff --git a/autobuild.xml b/autobuild.xml index 628d3f6883..50c5808bb5 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -2674,7 +2674,6 @@                  <array>                    <string>/build</string>                    <string>"/cfg=Release|Win32"</string> -                  <string>"/CL_ADD=/m:1"</string>                  </array>                </map>                <key>configure</key> diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp index ad9958546c..658fea944d 100644 --- a/indra/newview/llmaterialmgr.cpp +++ b/indra/newview/llmaterialmgr.cpp @@ -50,9 +50,7 @@  #define MATERIALS_CAP_MATERIAL_FIELD              "Material"  #define MATERIALS_CAP_OBJECT_ID_FIELD             "ID"  #define MATERIALS_CAP_MATERIAL_ID_FIELD           "MaterialID" -#define SIM_FEATURE_MAX_MATERIALS_PER_TRANSACTION "MaxMaterialsPerTransaction" -#define MATERIALS_DEFAULT_MAX_ENTRIES             50  #define MATERIALS_GET_TIMEOUT                     (60.f * 20)  #define MATERIALS_POST_TIMEOUT                    (60.f * 5)  #define MATERIALS_PUT_THROTTLE_SECS               1.f @@ -543,11 +541,9 @@ void LLMaterialMgr::onIdle(void*)  		instancep->processGetAllQueue();  	} -	static LLFrameTimer mPutTimer; -	if ( (!instancep->mPutQueue.empty()) && (mPutTimer.hasExpired()) ) +	if (!instancep->mPutQueue.empty())  	{  		instancep->processPutQueue(); -		mPutTimer.resetWithExpiry(MATERIALS_PUT_THROTTLE_SECS);  	}  } @@ -564,14 +560,14 @@ void LLMaterialMgr::processGetQueue()  			continue;  		} -		const LLViewerRegion* regionp = LLWorld::instance().getRegionFromID(region_id); +		LLViewerRegion* regionp = LLWorld::instance().getRegionFromID(region_id);  		if (!regionp)  		{  			LL_WARNS("Materials") << "Unknown region with id " << region_id.asString() << LL_ENDL;  			mGetQueue.erase(itRegionQueue);  			continue;  		} -		else if (!regionp->capabilitiesReceived()) +		else if (!regionp->capabilitiesReceived() || regionp->materialsCapThrottled())  		{  			continue;  		} @@ -594,7 +590,7 @@ void LLMaterialMgr::processGetQueue()  		LLSD materialsData = LLSD::emptyArray();  		material_queue_t& materials = itRegionQueue->second; -		U32 max_entries = getMaxEntries(regionp); +		U32 max_entries = regionp->getMaxMaterialsPerTransaction();  		material_queue_t::iterator loopMaterial = materials.begin();		  		while ( (materials.end() != loopMaterial) && (materialsData.size() < max_entries) )  		{ @@ -628,6 +624,7 @@ void LLMaterialMgr::processGetQueue()  		LL_DEBUGS("Materials") << "POSTing to region '" << regionp->getName() << "' at '"<< capURL << " for " << materialsData.size() << " materials."   			<< "\ndata: " << ll_pretty_print_sd(materialsData) << LL_ENDL;  		LLHTTPClient::post(capURL, postData, materialsResponder); +		regionp->resetMaterialsCapThrottle();  	}  } @@ -646,7 +643,7 @@ void LLMaterialMgr::processGetAllQueue()  			clearGetQueues(region_id);		// Invalidates region_id  			continue;  		} -		else if (!regionp->capabilitiesReceived()) +		else if (!regionp->capabilitiesReceived() || regionp->materialsCapThrottled())  		{  			continue;  		} @@ -663,6 +660,7 @@ void LLMaterialMgr::processGetAllQueue()  		LL_DEBUGS("Materials") << "GET all for region " << region_id << "url " << capURL << LL_ENDL;  		LLHTTPClient::ResponderPtr materialsResponder = new LLMaterialsResponder("GET", capURL, boost::bind(&LLMaterialMgr::onGetAllResponse, this, _1, _2, *itRegion));  		LLHTTPClient::get(capURL, materialsResponder); +		regionp->resetMaterialsCapThrottle();  		mGetAllPending.insert(std::pair<LLUUID, F64>(region_id, LLFrameTimer::getTotalSeconds()));  		mGetAllQueue.erase(itRegion);	// Invalidates region_id  	} @@ -670,7 +668,7 @@ void LLMaterialMgr::processGetAllQueue()  void LLMaterialMgr::processPutQueue()  { -	typedef std::map<const LLViewerRegion*, LLSD> regionput_request_map; +	typedef std::map<LLViewerRegion*, LLSD> regionput_request_map;  	regionput_request_map requests;  	put_queue_t::iterator loopQueue = mPutQueue.begin(); @@ -687,18 +685,18 @@ void LLMaterialMgr::processPutQueue()  		}  		else  		{ -			const LLViewerRegion* regionp = objectp->getRegion(); +			LLViewerRegion* regionp = objectp->getRegion();  			if ( !regionp )  			{  				LL_WARNS("Materials") << "Object region is NULL" << LL_ENDL;  				mPutQueue.erase(itQueue);  			} -			else if ( regionp->capabilitiesReceived()) +			else if ( regionp->capabilitiesReceived() && !regionp->materialsCapThrottled())  			{  				LLSD& facesData = requests[regionp];  				facematerial_map_t& face_map = itQueue->second; -				U32 max_entries = getMaxEntries(regionp); +				U32 max_entries = regionp->getMaxMaterialsPerTransaction();  				facematerial_map_t::iterator itFace = face_map.begin();  				while ( (face_map.end() != itFace) && (facesData.size() < max_entries) )  				{ @@ -722,11 +720,12 @@ void LLMaterialMgr::processPutQueue()  	for (regionput_request_map::const_iterator itRequest = requests.begin(); itRequest != requests.end(); ++itRequest)  	{ -		std::string capURL = itRequest->first->getCapability(MATERIALS_CAPABILITY_NAME); +		LLViewerRegion* regionp = itRequest->first; +		std::string capURL = regionp->getCapability(MATERIALS_CAPABILITY_NAME);  		if (capURL.empty())  		{  			LL_WARNS("Materials") << "Capability '" << MATERIALS_CAPABILITY_NAME -				<< "' is not defined on region '" << itRequest->first->getName() << "'" << LL_ENDL; +				<< "' is not defined on region '" << regionp->getName() << "'" << LL_ENDL;  			continue;  		} @@ -749,6 +748,7 @@ void LLMaterialMgr::processPutQueue()  			LL_DEBUGS("Materials") << "put for " << itRequest->second.size() << " faces to region " << itRequest->first->getName() << LL_ENDL;  			LLHTTPClient::ResponderPtr materialsResponder = new LLMaterialsResponder("PUT", capURL, boost::bind(&LLMaterialMgr::onPutResponse, this, _1, _2));  			LLHTTPClient::put(capURL, putData, materialsResponder); +			regionp->resetMaterialsCapThrottle();  		}  		else  		{ @@ -783,20 +783,3 @@ void LLMaterialMgr::onRegionRemoved(LLViewerRegion* regionp)  	// Put doesn't need clearing: objects that can't be found will clean up in processPutQueue()  } -U32 LLMaterialMgr::getMaxEntries(const LLViewerRegion* regionp) -{ -	LLSD sim_features; -	regionp->getSimulatorFeatures(sim_features); -	U32 max_entries; -	if (   sim_features.has( SIM_FEATURE_MAX_MATERIALS_PER_TRANSACTION ) -		&& sim_features[ SIM_FEATURE_MAX_MATERIALS_PER_TRANSACTION ].isInteger()) -	{ -		max_entries = sim_features[ SIM_FEATURE_MAX_MATERIALS_PER_TRANSACTION ].asInteger(); -	} -	else -	{ -		max_entries = MATERIALS_DEFAULT_MAX_ENTRIES; -	} -	return max_entries; -} - diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h index e83f1f4e01..e317a791ad 100644 --- a/indra/newview/llmaterialmgr.h +++ b/indra/newview/llmaterialmgr.h @@ -124,8 +124,6 @@ protected:  	put_queue_t mPutQueue;  	material_map_t mMaterials; - -	U32 getMaxEntries(const LLViewerRegion* regionp);  };  #endif // LL_LLMATERIALMGR_H diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index a4f6340d9e..e6fc82f761 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1944,3 +1944,47 @@ bool LLViewerRegion::dynamicPathfindingEnabled() const  			 mSimulatorFeatures["DynamicPathfindingEnabled"].asBoolean());  } +void LLViewerRegion::resetMaterialsCapThrottle() +{ +	F32 requests_per_sec = 	1.0f; // original default; +	if (   mSimulatorFeatures.has("RenderMaterialsCapability") +		&& mSimulatorFeatures["RenderMaterialsCapability"].isReal() ) +	{ +		requests_per_sec = mSimulatorFeatures["RenderMaterialsCapability"].asReal(); +		if ( requests_per_sec == 0.0f ) +		{ +			requests_per_sec = 1.0f; +			LL_WARNS("Materials") +				<< "region '" << getName() +				<< "' returned zero for RenderMaterialsCapability; using default " +				<< requests_per_sec << " per second" +				<< LL_ENDL; +		} +		LL_DEBUGS("Materials") << "region '" << getName() +							   << "' RenderMaterialsCapability " << requests_per_sec +							   << LL_ENDL; +	} +	else +	{ +		LL_DEBUGS("Materials") +			<< "region '" << getName() +			<< "' did not return RenderMaterialsCapability, using default " +			<< requests_per_sec << " per second" +			<< LL_ENDL; +	} +	 +	mMaterialsCapThrottleTimer.resetWithExpiry( 1.0f / requests_per_sec ); +} + +U32 LLViewerRegion::getMaxMaterialsPerTransaction() const +{ +	U32 max_entries = 50; // original hard coded default +	if (   mSimulatorFeatures.has( "MaxMaterialsPerTransaction" ) +		&& mSimulatorFeatures[ "MaxMaterialsPerTransaction" ].isInteger()) +	{ +		max_entries = mSimulatorFeatures[ "MaxMaterialsPerTransaction" ].asInteger(); +	} +	return max_entries; +} + + diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 031159183b..109baccf9a 100755 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -43,6 +43,7 @@  #include "llcapabilityprovider.h"  #include "m4math.h"					// LLMatrix4  #include "llhttpclient.h" +#include "llframetimer.h"  // Surface id's  #define LAND  1 @@ -342,7 +343,12 @@ public:  	void getNeighboringRegionsStatus( std::vector<S32>& regions );  	const LLViewerRegionImpl * getRegionImpl() const { return mImpl; }  	LLViewerRegionImpl * getRegionImplNC() { return mImpl; } + +	// implements the materials capability throttle +	bool materialsCapThrottled() const { return !mMaterialsCapThrottleTimer.hasExpired(); } +	void resetMaterialsCapThrottle(); +	U32 getMaxMaterialsPerTransaction() const;  public:  	struct CompareDistance  	{ @@ -434,6 +440,9 @@ private:  	BOOL mReleaseNotesRequested;  	LLSD mSimulatorFeatures; + +	// the materials capability throttle +	LLFrameTimer mMaterialsCapThrottleTimer;  };  inline BOOL LLViewerRegion::getRegionProtocol(U64 protocol) const diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml index 5ac2ec2b20..426c0c4915 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -663,7 +663,7 @@               label_width="205"               layout="topleft"               left="10" -             min_val="-1" +             min_val="0"               name="bumpyOffsetU"               width="265" />              <spinner @@ -674,7 +674,7 @@               label_width="205"               layout="topleft"               left="10" -             min_val="-1" +             min_val="0"               name="bumpyOffsetV"               width="265" />              <spinner @@ -726,7 +726,7 @@               label_width="205"               layout="topleft"               left="10" -             min_val="-1" +             min_val="0"               name="shinyOffsetU"               width="265" />              <spinner @@ -737,7 +737,7 @@               label_width="205"               layout="topleft"               left="10" -             min_val="-1" +             min_val="0"               name="shinyOffsetV"               width="265" />              <check_box | 
