diff options
| author | Rider Linden <none@none> | 2015-04-15 16:40:01 -0700 | 
|---|---|---|
| committer | Rider Linden <none@none> | 2015-04-15 16:40:01 -0700 | 
| commit | 0d302e692fd25e5dd7a37b5ac4c9d14f3e5d470d (patch) | |
| tree | 7acb6f2190f261682675b87b56eccbac67d3a736 /indra/newview | |
| parent | e027fbb79f82e89400afd06e1ce817e5c18da34e (diff) | |
Avatar rendering accountant upgrade.
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llavatarrenderinfoaccountant.cpp | 486 | ||||
| -rw-r--r-- | indra/newview/llavatarrenderinfoaccountant.h | 5 | ||||
| -rwxr-xr-x | indra/newview/llviewerregion.cpp | 40 | 
3 files changed, 215 insertions, 316 deletions
| diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp index aeaa832bc7..d532dbc6b1 100644 --- a/indra/newview/llavatarrenderinfoaccountant.cpp +++ b/indra/newview/llavatarrenderinfoaccountant.cpp @@ -46,6 +46,7 @@  #include "llhttpsdhandler.h"  #include "httpheaders.h"  #include "httpoptions.h" +#include "llcorehttputil.h"  static	const std::string KEY_AGENTS = "agents";			// map  static 	const std::string KEY_WEIGHT = "weight";			// integer @@ -59,268 +60,176 @@ static	const std::string KEY_ERROR = "error";  LLFrameTimer LLAvatarRenderInfoAccountant::sRenderInfoReportTimer;  //LLCore::HttpRequest::ptr_t LLAvatarRenderInfoAccountant::sHttpRequest; -#if 0  //========================================================================= -class LLAvatarRenderInfoHandler : public LLHttpSDHandler +void LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro(LLCoros::self& self, std::string url, U64 regionHandle)  { -public: -	LLAvatarRenderInfoHandler(const LLURI &uri, U64 regionHandle); +    LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); +    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t  +        httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("EnvironmentRequest", httpPolicy)); +    LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + +    LLSD result = httpAdapter->getAndYield(self, httpRequest, url); + +    LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); +    if (!regionp) +    { +        LL_WARNS("AvatarRenderInfoAccountant") << "Avatar render weight info received but region not found for "  +                << regionHandle << LL_ENDL; +        return; +    } + +    LLSD httpResults = result["http_result"]; +    LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroHandler::getStatusFromLLSD(httpResults); + +    if (!status) +    { +        LL_WARNS("AvatarRenderInfoAccountant") << "HTTP status, " << status.toTerseString() << LL_ENDL; +        return; +    } + +    if (result.has(KEY_AGENTS)) +    { +        const LLSD & agents = result[KEY_AGENTS]; +        if (agents.isMap()) +        { +            LLSD::map_const_iterator	report_iter = agents.beginMap(); +            while (report_iter != agents.endMap()) +            { +                LLUUID target_agent_id = LLUUID(report_iter->first); +                const LLSD & agent_info_map = report_iter->second; +                LLViewerObject* avatarp = gObjectList.findObject(target_agent_id); +                if (avatarp &&  +                    avatarp->isAvatar() && +                    agent_info_map.isMap()) +                {	// Extract the data for this avatar + +                    if (LLAvatarRenderInfoAccountant::logRenderInfo()) +                    { +                        LL_INFOS() << "LRI:  Agent " << target_agent_id  +                            << ": " << agent_info_map << LL_ENDL; +                    } + +                    if (agent_info_map.has(KEY_WEIGHT)) +                    { +                        ((LLVOAvatar *) avatarp)->setReportedVisualComplexity(agent_info_map[KEY_WEIGHT].asInteger()); +                    } +                } +                report_iter++; +            } +        } +    }	// has "agents" +    else if (result.has(KEY_ERROR)) +    { +        const LLSD & error = result[KEY_ERROR]; +        LL_WARNS() << "Avatar render info GET error: " +            << error[KEY_IDENTIFIER] +            << ": " << error[KEY_MESSAGE]  +            << " from region " << regionp->getName() +            << LL_ENDL; +    } -protected: -	virtual void onSuccess(LLCore::HttpResponse * response, LLSD &content); -	virtual void onFailure(LLCore::HttpResponse * response, LLCore::HttpStatus status); - -private: -	U64	mRegionHandle; -}; - -LLAvatarRenderInfoHandler::LLAvatarRenderInfoHandler(const LLURI &uri, U64 regionHandle) : -	LLHttpSDHandler(uri), -	mRegionHandle(regionHandle) -{ -} - -void LLAvatarRenderInfoHandler::onSuccess(LLCore::HttpResponse * response, LLSD &content) -{ -	LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); -	if (regionp) -	{ -		if (LLAvatarRenderInfoAccountant::logRenderInfo()) -		{ -			LL_INFOS() << "LRI: Result for avatar weights request for region " << regionp->getName() << ":" << LL_ENDL; -		} - -		if (content.isMap()) -		{ -			if (content.has(KEY_AGENTS)) -			{ -				const LLSD & agents = content[KEY_AGENTS]; -				if (agents.isMap()) -				{ -					LLSD::map_const_iterator	report_iter = agents.beginMap(); -					while (report_iter != agents.endMap()) -					{ -						LLUUID target_agent_id = LLUUID(report_iter->first); -						const LLSD & agent_info_map = report_iter->second; -						LLViewerObject* avatarp = gObjectList.findObject(target_agent_id); -						if (avatarp && -							avatarp->isAvatar() && -							agent_info_map.isMap()) -						{	// Extract the data for this avatar - -							if (LLAvatarRenderInfoAccountant::logRenderInfo()) -							{ -								LL_INFOS() << "LRI:  Agent " << target_agent_id -									<< ": " << agent_info_map << LL_ENDL; -							} - -							if (agent_info_map.has(KEY_WEIGHT)) -							{ -								((LLVOAvatar *)avatarp)->setReportedVisualComplexity(agent_info_map[KEY_WEIGHT].asInteger()); -							} -						} -						report_iter++; -					} -				} -			}	// has "agents" -			else if (content.has(KEY_ERROR)) -			{ -				const LLSD & error = content[KEY_ERROR]; -				LL_WARNS() << "Avatar render info GET error: " -					<< error[KEY_IDENTIFIER] -					<< ": " << error[KEY_MESSAGE] -					<< " from region " << regionp->getName() -					<< LL_ENDL; -			} -		} -	} -	else -	{ -		LL_INFOS() << "Avatar render weight info received but region not found for " -			<< mRegionHandle << LL_ENDL; -	}  } -void LLAvatarRenderInfoHandler::onFailure(LLCore::HttpResponse * response, LLCore::HttpStatus status) -{ -	LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); -	if (regionp) -	{ -		LL_WARNS() << "HTTP error result for avatar weight GET: " << status.toULong() -			<< ", " << status.toString() -			<< " returned by region " << regionp->getName() -			<< LL_ENDL; -	} -	else -	{ -		LL_WARNS() << "Avatar render weight GET error received but region not found for "  -			<< mRegionHandle  -			<< ", error " << status.toULong() -			<< ", " << status.toString() -			<< LL_ENDL; -	} -} - -  //------------------------------------------------------------------------- -#else -// HTTP responder class for GET request for avatar render weight information -class LLAvatarRenderInfoGetResponder : public LLHTTPClient::Responder -{ -public: -	LLAvatarRenderInfoGetResponder(U64 region_handle) : mRegionHandle(region_handle) -	{ -	} - -	virtual void error(U32 statusNum, const std::string& reason) -	{ -		LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); -		if (regionp) -		{ -			LL_WARNS() << "HTTP error result for avatar weight GET: " << statusNum  -				<< ", " << reason -				<< " returned by region " << regionp->getName() -				<< LL_ENDL; -		} -		else -		{ -			LL_WARNS() << "Avatar render weight GET error recieved but region not found for "  -				<< mRegionHandle  -				<< ", error " << statusNum  -				<< ", " << reason -				<< LL_ENDL; -		} - -	} - -	virtual void result(const LLSD& content) -	{ -		LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); -		if (regionp) -		{ -			if (LLAvatarRenderInfoAccountant::logRenderInfo()) -			{ -				LL_INFOS() << "LRI: Result for avatar weights request for region " << regionp->getName() << ":" << LL_ENDL; -			} - -			if (content.isMap()) -			{ -				if (content.has(KEY_AGENTS)) -				{ -					const LLSD & agents = content[KEY_AGENTS]; -					if (agents.isMap()) -					{ -						LLSD::map_const_iterator	report_iter = agents.beginMap(); -						while (report_iter != agents.endMap()) -						{ -							LLUUID target_agent_id = LLUUID(report_iter->first); -							const LLSD & agent_info_map = report_iter->second; -							LLViewerObject* avatarp = gObjectList.findObject(target_agent_id); -							if (avatarp &&  -								avatarp->isAvatar() && -								agent_info_map.isMap()) -							{	// Extract the data for this avatar - -								if (LLAvatarRenderInfoAccountant::logRenderInfo()) -								{ -									LL_INFOS() << "LRI:  Agent " << target_agent_id  -										<< ": " << agent_info_map << LL_ENDL; -								} - -								if (agent_info_map.has(KEY_WEIGHT)) -								{ -									((LLVOAvatar *) avatarp)->setReportedVisualComplexity(agent_info_map[KEY_WEIGHT].asInteger()); -								} -							} -							report_iter++; -						} -					} -				}	// has "agents" -				else if (content.has(KEY_ERROR)) -				{ -					const LLSD & error = content[KEY_ERROR]; -					LL_WARNS() << "Avatar render info GET error: " -						<< error[KEY_IDENTIFIER] -						<< ": " << error[KEY_MESSAGE]  -						<< " from region " << regionp->getName() -						<< LL_ENDL; -				} -			} -		} -		else -		{ -			LL_INFOS() << "Avatar render weight info received but region not found for "  -				<< mRegionHandle << LL_ENDL; -		} -	} - -private: -	U64		mRegionHandle; -}; -#endif - -// HTTP responder class for POST request for avatar render weight information -class LLAvatarRenderInfoPostResponder : public LLHTTPClient::Responder +void LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro(LLCoros::self& self, std::string url, U64 regionHandle)  { -public: -	LLAvatarRenderInfoPostResponder(U64 region_handle) : mRegionHandle(region_handle) -	{ -	} +    LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); +    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t +        httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("EnvironmentRequest", httpPolicy)); +    LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + +    LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); +    if (!regionp) +    { +        LL_WARNS("AvatarRenderInfoAccountant") << "Avatar render weight calculation but region not found for " +            << regionHandle << LL_ENDL; +        return; +    } + +    if (logRenderInfo()) +    { +        LL_INFOS("AvatarRenderInfoAccountant") << "LRI: Sending avatar render info to region " << regionp->getName() +                << " from " << url << LL_ENDL; +    } + +    // Build the render info to POST to the region +    LLSD report = LLSD::emptyMap(); +    LLSD agents = LLSD::emptyMap(); + +    std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); +    while( iter != LLCharacter::sInstances.end() ) +    { +        LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*iter); +        if (avatar && +            avatar->getRezzedStatus() >= 2 &&					// Mostly rezzed (maybe without baked textures downloaded) +            !avatar->isDead() &&								// Not dead yet +            avatar->getObjectHost() == regionp->getHost())		// Ensure it's on the same region +        { +            avatar->calculateUpdateRenderCost();			// Make sure the numbers are up-to-date + +            LLSD info = LLSD::emptyMap(); +            if (avatar->getVisualComplexity() > 0) +            { +                info[KEY_WEIGHT] = avatar->getVisualComplexity(); +                agents[avatar->getID().asString()] = info; + +                if (logRenderInfo()) +                { +                    LL_INFOS("AvatarRenderInfoAccountant") << "LRI: Sending avatar render info for " << avatar->getID() +                            << ": " << info << LL_ENDL; +                    LL_INFOS("AvatarRenderInfoAccountant") << "LRI: other info geometry " << avatar->getAttachmentGeometryBytes() +                            << ", area " << avatar->getAttachmentSurfaceArea() +                            << LL_ENDL; +                } +            } +        } +        iter++; +    } + +    if (agents.size() == 0) +        return; + +    report[KEY_AGENTS] = agents; +    regionp = NULL; +    LLSD result = httpAdapter->postAndYield(self, httpRequest, url, report); + +    regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); +    if (!regionp) +    { +        LL_INFOS("AvatarRenderInfoAccountant") << "Avatar render weight POST result received but region not found for " +                << regionHandle << LL_ENDL; +        return; +    } + +    LLSD httpResults = result["http_result"]; +    LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroHandler::getStatusFromLLSD(httpResults); +    if (!status) +    { +        LL_WARNS("AvatarRenderInfoAccountant") << "HTTP status, " << status.toTerseString() << LL_ENDL; +        return; +    } + +    if (LLAvatarRenderInfoAccountant::logRenderInfo()) +    { +        LL_INFOS("AvatarRenderInfoAccountant") << "LRI: Result for avatar weights POST for region " << regionp->getName() +            << ": " << result << LL_ENDL; +    } + +    if (result.isMap()) +    { +        if (result.has(KEY_ERROR)) +        { +            const LLSD & error = result[KEY_ERROR]; +            LL_WARNS("AvatarRenderInfoAccountant") << "Avatar render info POST error: " +                << error[KEY_IDENTIFIER] +                << ": " << error[KEY_MESSAGE]  +                << " from region " << regionp->getName() +                << LL_ENDL; +        } +    } -	virtual void error(U32 statusNum, const std::string& reason) -	{ -		LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); -		if (regionp) -		{ -			LL_WARNS() << "HTTP error result for avatar weight POST: " << statusNum  -				<< ", " << reason -				<< " returned by region " << regionp->getName() -				<< LL_ENDL; -		} -		else -		{ -			LL_WARNS() << "Avatar render weight POST error received but region not found for "  -				<< mRegionHandle  -				<< ", error " << statusNum  -				<< ", " << reason -				<< LL_ENDL; -		} -	} -	virtual void result(const LLSD& content) -	{ -		LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); -		if (regionp) -		{ -			if (LLAvatarRenderInfoAccountant::logRenderInfo()) -			{ -				LL_INFOS() << "LRI: Result for avatar weights POST for region " << regionp->getName() -					<< ": " << content << LL_ENDL; -			} - -			if (content.isMap()) -			{ -				if (content.has(KEY_ERROR)) -				{ -					const LLSD & error = content[KEY_ERROR]; -					LL_WARNS() << "Avatar render info POST error: " -						<< error[KEY_IDENTIFIER] -						<< ": " << error[KEY_MESSAGE]  -						<< " from region " << regionp->getName() -						<< LL_ENDL; -				} -			} -		} -		else -		{ -			LL_INFOS() << "Avatar render weight POST result recieved but region not found for "  -				<< mRegionHandle << LL_ENDL; -		} -	} - -private: -	U64		mRegionHandle; -}; +}  // static   // Send request for one region, no timer checks @@ -329,53 +238,9 @@ void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regio  	std::string url = regionp->getCapability("AvatarRenderInfo");  	if (!url.empty())  	{ -		if (logRenderInfo()) -		{ -			LL_INFOS() << "LRI: Sending avatar render info to region " -				<< regionp->getName()  -				<< " from " << url -				<< LL_ENDL; -		} - -		// Build the render info to POST to the region -		LLSD report = LLSD::emptyMap(); -		LLSD agents = LLSD::emptyMap(); -				 -		std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); -		while( iter != LLCharacter::sInstances.end() ) -		{ -			LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*iter); -			if (avatar && -				avatar->getRezzedStatus() >= 2 &&					// Mostly rezzed (maybe without baked textures downloaded) -				!avatar->isDead() &&								// Not dead yet -				avatar->getObjectHost() == regionp->getHost())		// Ensure it's on the same region -			{ -				avatar->calculateUpdateRenderCost();			// Make sure the numbers are up-to-date - -				LLSD info = LLSD::emptyMap(); -				if (avatar->getVisualComplexity() > 0) -				{ -					info[KEY_WEIGHT] = avatar->getVisualComplexity(); -					agents[avatar->getID().asString()] = info; - -					if (logRenderInfo()) -					{ -						LL_INFOS() << "LRI: Sending avatar render info for " << avatar->getID() -							<< ": " << info << LL_ENDL; -						LL_INFOS() << "LRI: other info geometry " << avatar->getAttachmentGeometryBytes() -							<< ", area " << avatar->getAttachmentSurfaceArea() -							<< LL_ENDL; -					} -				} -			} -			iter++; -		} - -		report[KEY_AGENTS] = agents; -		if (agents.size() > 0) -		{ -			LLHTTPClient::post(url, report, new LLAvatarRenderInfoPostResponder(regionp->getHandle())); -		} +        std::string coroname = +            LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro", +            boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro, _1, url, regionp->getHandle()));  	}  } @@ -398,19 +263,9 @@ void LLAvatarRenderInfoAccountant::getRenderInfoFromRegion(LLViewerRegion * regi  		}  		// First send a request to get the latest data -#if 0 -		if (!LLAvatarRenderInfoAccountant::sHttpRequest) -			sHttpRequest = LLCore::HttpRequest::ptr_t(new LLCore::HttpRequest()); -		LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp()); - -		LLCore::HttpHeaders::ptr_t httpHeaders = LLCore::HttpHeaders::ptr_t(new LLCore::HttpHeaders(), false); -		LLCore::HttpOptions::ptr_t httpOptions = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions(), false); -		LLCore::HttpRequest::policy_t httpPolicy = app_core_http.getPolicy(LLAppCoreHttp::AP_AGENT); - -		LLCore::HttpHandle handle = sHttpRequest-> -#else -		LLHTTPClient::get(url, new LLAvatarRenderInfoGetResponder(regionp->getHandle())); -#endif +        std::string coroname = +            LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro", +            boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro, _1, url, regionp->getHandle()));  	}  } @@ -514,6 +369,7 @@ void LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer(const LLUUID& reg  // static   bool LLAvatarRenderInfoAccountant::logRenderInfo()  { -	static LLCachedControl<bool> render_mute_logging_enabled(gSavedSettings, "RenderAutoMuteLogging", false); -	return render_mute_logging_enabled; +    return true; +// 	static LLCachedControl<bool> render_mute_logging_enabled(gSavedSettings, "RenderAutoMuteLogging", false); +// 	return render_mute_logging_enabled;  } diff --git a/indra/newview/llavatarrenderinfoaccountant.h b/indra/newview/llavatarrenderinfoaccountant.h index 13054f5e2f..1736f03772 100644 --- a/indra/newview/llavatarrenderinfoaccountant.h +++ b/indra/newview/llavatarrenderinfoaccountant.h @@ -30,6 +30,7 @@  #define LL_llavatarrenderinfoaccountant_H  #include "httpcommon.h" +#include "llcoros.h"  class LLViewerRegion; @@ -55,7 +56,9 @@ private:  	// Send data updates about once per minute, only need per-frame resolution  	static LLFrameTimer sRenderInfoReportTimer; -//	static LLCore::HttpRequest::ptr_t	sHttpRequest; +    static void avatarRenderInfoGetCoro(LLCoros::self& self, std::string url, U64 regionHandle); +    static void avatarRenderInfoReportCoro(LLCoros::self& self, std::string url, U64 regionHandle); +  }; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 36dd778746..f78b08eb70 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -201,6 +201,46 @@ public:      void        requestSimulatorFeatureCoro(LLCoros::self& self, std::string url, U64 regionHandle);  }; +// support for secondlife:///app/region/{REGION} SLapps
 +// N.B. this is defined to work exactly like the classic secondlife://{REGION}
 +// However, the later syntax cannot support spaces in the region name because
 +// spaces (and %20 chars) are illegal in the hostname of an http URL. Some
 +// browsers let you get away with this, but some do not (such as Qt's Webkit).
 +// Hence we introduced the newer secondlife:///app/region alternative.
 +class LLRegionHandler : public LLCommandHandler
 +{
 +public:
 +    // requests will be throttled from a non-trusted browser
 +    LLRegionHandler() : LLCommandHandler("region", UNTRUSTED_THROTTLE) {}
 +        
 +    bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
 +    {
 +        // make sure that we at least have a region name
 +        int num_params = params.size();
 +        if (num_params < 1)
 +        {
 +            return false;
 +        }
 +            
 +        // build a secondlife://{PLACE} SLurl from this SLapp
 +        std::string url = "secondlife://";
 +        for (int i = 0; i < num_params; i++)
 +        {
 +            if (i > 0)
 +            {
 +                url += "/";
 +            }
 +            url += params[i].asString();
 +        }
 +            
 +        // Process the SLapp as if it was a secondlife://{PLACE} SLurl
 +        LLURLDispatcher::dispatch(url, "clicked", web, true);
 +        return true;
 +    }
 +        
 +};
 +LLRegionHandler gRegionHandler; +  void LLViewerRegionImpl::requestBaseCapabilitiesCoro(LLCoros::self& self, U64 regionHandle)  {      LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); | 
