Merge
commit
cbf7280906
|
|
@ -2674,7 +2674,6 @@
|
|||
<array>
|
||||
<string>/build</string>
|
||||
<string>"/cfg=Release|Win32"</string>
|
||||
<string>"/CL_ADD=/m:1"</string>
|
||||
</array>
|
||||
</map>
|
||||
<key>configure</key>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -124,8 +124,6 @@ protected:
|
|||
put_queue_t mPutQueue;
|
||||
|
||||
material_map_t mMaterials;
|
||||
|
||||
U32 getMaxEntries(const LLViewerRegion* regionp);
|
||||
};
|
||||
|
||||
#endif // LL_LLMATERIALMGR_H
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue