Merge branch 'DRTVWR-565-maint-P' of https://bitbucket.org/lindenlab/viewer
# Conflicts: # indra/newview/llinventorybridge.cpp # indra/newview/llinventorybridge.h # indra/newview/llviewerparcelmgr.cppmeow-7.2.2
commit
835d454a52
|
|
@ -666,7 +666,6 @@ char const* const _PREHASH_GroupRolesCount = LLMessageStringTable::getInstance()
|
|||
char const* const _PREHASH_SimulatorBlock = LLMessageStringTable::getInstance()->getString("SimulatorBlock");
|
||||
char const* const _PREHASH_GroupID = LLMessageStringTable::getInstance()->getString("GroupID");
|
||||
char const* const _PREHASH_AgentVel = LLMessageStringTable::getInstance()->getString("AgentVel");
|
||||
char const* const _PREHASH_RequestImage = LLMessageStringTable::getInstance()->getString("RequestImage");
|
||||
char const* const _PREHASH_NetStats = LLMessageStringTable::getInstance()->getString("NetStats");
|
||||
char const* const _PREHASH_AgentPos = LLMessageStringTable::getInstance()->getString("AgentPos");
|
||||
char const* const _PREHASH_AgentSit = LLMessageStringTable::getInstance()->getString("AgentSit");
|
||||
|
|
@ -1047,7 +1046,6 @@ char const* const _PREHASH_SortOrder = LLMessageStringTable::getInstance()->getS
|
|||
char const* const _PREHASH_Hunter = LLMessageStringTable::getInstance()->getString("Hunter");
|
||||
char const* const _PREHASH_SunAngVelocity = LLMessageStringTable::getInstance()->getString("SunAngVelocity");
|
||||
char const* const _PREHASH_BinaryBucket = LLMessageStringTable::getInstance()->getString("BinaryBucket");
|
||||
char const* const _PREHASH_ImagePacket = LLMessageStringTable::getInstance()->getString("ImagePacket");
|
||||
char const* const _PREHASH_StartGroupProposal = LLMessageStringTable::getInstance()->getString("StartGroupProposal");
|
||||
char const* const _PREHASH_EnergyLevel = LLMessageStringTable::getInstance()->getString("EnergyLevel");
|
||||
char const* const _PREHASH_PriceForListing = LLMessageStringTable::getInstance()->getString("PriceForListing");
|
||||
|
|
@ -1236,7 +1234,6 @@ char const* const _PREHASH_ForceScriptControlRelease = LLMessageStringTable::get
|
|||
char const* const _PREHASH_ParcelRelease = LLMessageStringTable::getInstance()->getString("ParcelRelease");
|
||||
char const* const _PREHASH_VFileType = LLMessageStringTable::getInstance()->getString("VFileType");
|
||||
char const* const _PREHASH_EjectGroupMemberReply = LLMessageStringTable::getInstance()->getString("EjectGroupMemberReply");
|
||||
char const* const _PREHASH_ImageData = LLMessageStringTable::getInstance()->getString("ImageData");
|
||||
char const* const _PREHASH_SimulatorViewerTimeMessage = LLMessageStringTable::getInstance()->getString("SimulatorViewerTimeMessage");
|
||||
char const* const _PREHASH_Rotation = LLMessageStringTable::getInstance()->getString("Rotation");
|
||||
char const* const _PREHASH_Selection = LLMessageStringTable::getInstance()->getString("Selection");
|
||||
|
|
|
|||
|
|
@ -666,7 +666,6 @@ extern char const* const _PREHASH_GroupRolesCount;
|
|||
extern char const* const _PREHASH_SimulatorBlock;
|
||||
extern char const* const _PREHASH_GroupID;
|
||||
extern char const* const _PREHASH_AgentVel;
|
||||
extern char const* const _PREHASH_RequestImage;
|
||||
extern char const* const _PREHASH_NetStats;
|
||||
extern char const* const _PREHASH_AgentPos;
|
||||
extern char const* const _PREHASH_AgentSit;
|
||||
|
|
@ -1047,7 +1046,6 @@ extern char const* const _PREHASH_SortOrder;
|
|||
extern char const* const _PREHASH_Hunter;
|
||||
extern char const* const _PREHASH_SunAngVelocity;
|
||||
extern char const* const _PREHASH_BinaryBucket;
|
||||
extern char const* const _PREHASH_ImagePacket;
|
||||
extern char const* const _PREHASH_StartGroupProposal;
|
||||
extern char const* const _PREHASH_EnergyLevel;
|
||||
extern char const* const _PREHASH_PriceForListing;
|
||||
|
|
|
|||
|
|
@ -173,7 +173,7 @@ public:
|
|||
virtual BOOL removeItem() = 0;
|
||||
virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch) = 0;
|
||||
|
||||
virtual BOOL isItemCopyable() const = 0;
|
||||
virtual bool isItemCopyable(bool can_copy_as_link = true) const = 0;
|
||||
virtual BOOL copyToClipboard() const = 0;
|
||||
virtual BOOL cutToClipboard() = 0;
|
||||
virtual bool isCutToClipboard() { return false; };
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ public:
|
|||
virtual BOOL removeItem() { return FALSE; }
|
||||
virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch) { }
|
||||
virtual void move( LLFolderViewModelItem* parent_listener ) { }
|
||||
virtual BOOL isItemCopyable() const { return FALSE; }
|
||||
virtual bool isItemCopyable(bool can_copy_as_link = true) const { return false; }
|
||||
virtual BOOL copyToClipboard() const { return FALSE; }
|
||||
virtual BOOL cutToClipboard() { return FALSE; }
|
||||
virtual BOOL isClipboardPasteable() const { return FALSE; }
|
||||
|
|
|
|||
|
|
@ -662,7 +662,7 @@ BOOL LLInvFVBridge::isClipboardPasteable() const
|
|||
if (cat)
|
||||
{
|
||||
LLFolderBridge cat_br(mInventoryPanel.get(), mRoot, item_id);
|
||||
if (!cat_br.isItemCopyable())
|
||||
if (!cat_br.isItemCopyable(false))
|
||||
return FALSE;
|
||||
// Skip to the next item in the clipboard
|
||||
continue;
|
||||
|
|
@ -670,7 +670,7 @@ BOOL LLInvFVBridge::isClipboardPasteable() const
|
|||
|
||||
// Each item must be copyable to be pastable
|
||||
LLItemBridge item_br(mInventoryPanel.get(), mRoot, item_id);
|
||||
if (!item_br.isItemCopyable())
|
||||
if (!item_br.isItemCopyable(false))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
|
@ -702,6 +702,11 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
|
|||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (gInventory.isObjectDescendentOf(item->getUUID(), gInventory.getLibraryRootFolderID()))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
const LLViewerInventoryCategory *cat = model->getCategory(objects.at(i));
|
||||
if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
|
||||
|
|
@ -943,7 +948,8 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
|
|||
disabled_items.push_back(std::string("Paste"));
|
||||
}
|
||||
|
||||
if (gSavedSettings.getBOOL("InventoryLinking")
|
||||
static LLCachedControl<bool> inventory_linking(gSavedSettings, "InventoryLinking", true);
|
||||
if (inventory_linking
|
||||
// <FS:TT> Client LSL Bridge (also for #AO)
|
||||
&& !isLockedFolder()
|
||||
// </FS:TT>
|
||||
|
|
@ -2264,7 +2270,8 @@ BOOL LLItemBridge::removeItem()
|
|||
// [SL:KB] - Patch: Inventory-Links | Checked: 2010-06-01 (Catznip-2.2.0a) | Added: Catznip-2.0.1a
|
||||
// Users move folders around and reuse links that way... if we know something has links then it's just bad not to warn them :|
|
||||
// [/SL:KB]
|
||||
// if (!gSavedSettings.getBOOL("InventoryLinking"))
|
||||
// static LLCachedControl<bool> inventory_linking(gSavedSettings, "InventoryLinking", true);
|
||||
// if (!inventory_linking)
|
||||
{
|
||||
if (!item->getIsLinkType())
|
||||
{
|
||||
|
|
@ -2307,39 +2314,42 @@ BOOL LLItemBridge::confirmRemoveItem(const LLSD& notification, const LLSD& respo
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL LLItemBridge::isItemCopyable() const
|
||||
bool LLItemBridge::isItemCopyable(bool can_copy_as_link) const
|
||||
{
|
||||
LLViewerInventoryItem* item = getItem();
|
||||
if (item)
|
||||
{
|
||||
LLViewerInventoryItem* item = getItem();
|
||||
if (!item)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
// Can't copy worn objects.
|
||||
// Worn objects are tied to their inworld conterparts
|
||||
// Copy of modified worn object will return object with obsolete asset and inventory
|
||||
if(get_is_item_worn(mUUID))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
// Can't copy worn objects.
|
||||
// Worn objects are tied to their inworld conterparts
|
||||
// Copy of modified worn object will return object with obsolete asset and inventory
|
||||
if (get_is_item_worn(mUUID))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
|
||||
// [SL:KB] - Patch: Inventory-Links | Checked: 2010-04-12 (Catznip-2.2.0a) | Added: Catznip-2.0.0a
|
||||
// We'll allow copying a link if:
|
||||
// - its target is available
|
||||
// - it doesn't point to another link [see LLViewerInventoryItem::getLinkedItem() which returns NULL in that case]
|
||||
if (item->getIsLinkType())
|
||||
{
|
||||
return (NULL != item->getLinkedItem());
|
||||
}
|
||||
// We'll allow copying a link if:
|
||||
// - its target is available
|
||||
// - it doesn't point to another link [see LLViewerInventoryItem::getLinkedItem() which returns NULL in that case]
|
||||
if (item->getIsLinkType())
|
||||
{
|
||||
return (NULL != item->getLinkedItem());
|
||||
}
|
||||
|
||||
// User can copy the item if:
|
||||
// - the item (or its target in the case of a link) is "copy"
|
||||
// - and/or if the item (or its target in the case of a link) has a linkable asset type
|
||||
// NOTE: we do *not* want to return TRUE on everything like LL seems to do in SL-2.1.0 because not all types are "linkable"
|
||||
return (item->getPermissions().allowCopyBy(gAgent.getID()));
|
||||
// User can copy the item if:
|
||||
// - the item (or its target in the case of a link) is "copy"
|
||||
|
||||
// NOTE: we do *not* want to return TRUE on everything like LL seems to do in SL-2.1.0 because not all types are "linkable"
|
||||
return (item->getPermissions().allowCopyBy(gAgent.getID()));
|
||||
// [/SL:KB]
|
||||
// return item->getPermissions().allowCopyBy(gAgent.getID()) || gSavedSettings.getBOOL("InventoryLinking");
|
||||
}
|
||||
return FALSE;
|
||||
// static LLCachedControl<bool> inventory_linking(gSavedSettings, "InventoryLinking", true);
|
||||
// return (can_copy_as_link && inventory_linking)
|
||||
// || item->getPermissions().allowCopyBy(gAgent.getID());
|
||||
|
||||
}
|
||||
|
||||
// [SL:KB] - Patch: Inventory-Links | Checked: 2013-09-19 (Catznip-3.6)
|
||||
|
|
@ -2586,7 +2596,7 @@ BOOL LLFolderBridge::isUpToDate() const
|
|||
return category->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN;
|
||||
}
|
||||
|
||||
BOOL LLFolderBridge::isItemCopyable() const
|
||||
bool LLFolderBridge::isItemCopyable(bool can_copy_as_link) const
|
||||
{
|
||||
// Folders are copyable if items in them are, recursively, copyable.
|
||||
|
||||
|
|
@ -2601,22 +2611,26 @@ BOOL LLFolderBridge::isItemCopyable() const
|
|||
{
|
||||
LLInventoryItem* item = *iter;
|
||||
LLItemBridge item_br(mInventoryPanel.get(), mRoot, item->getUUID());
|
||||
if (!item_br.isItemCopyable())
|
||||
return FALSE;
|
||||
}
|
||||
if (!item_br.isItemCopyable(false))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Check the folders
|
||||
LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
|
||||
for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
|
||||
{
|
||||
{
|
||||
LLViewerInventoryCategory* category = *iter;
|
||||
LLFolderBridge cat_br(mInventoryPanel.get(), mRoot, category->getUUID());
|
||||
if (!cat_br.isItemCopyable())
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
if (!cat_br.isItemCopyable(false))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// [SL:KB] - Patch: Inventory-Links | Checked: 2013-09-19 (Catznip-3.6)
|
||||
bool LLFolderBridge::isItemLinkable() const
|
||||
|
|
@ -4126,6 +4140,7 @@ void LLFolderBridge::perform_pasteFromClipboard()
|
|||
LLInventoryObject *obj = model->getObject(item_id);
|
||||
if (obj)
|
||||
{
|
||||
|
||||
if (move_is_into_lost_and_found)
|
||||
{
|
||||
if (LLAssetType::AT_CATEGORY == obj->getType())
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ public:
|
|||
//virtual BOOL removeItem() = 0;
|
||||
virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch);
|
||||
virtual void move(LLFolderViewModelItem* new_parent_bridge) {}
|
||||
virtual BOOL isItemCopyable() const { return FALSE; }
|
||||
virtual bool isItemCopyable(bool can_copy_as_link = true) const { return false; }
|
||||
// [SL:KB] - Patch: Inventory-Links | Checked: 2013-09-19 (Catznip-3.6)
|
||||
virtual bool isItemLinkable() const { return FALSE; }
|
||||
// [/SL:KB]
|
||||
|
|
@ -260,7 +260,7 @@ public:
|
|||
virtual BOOL isItemRenameable() const;
|
||||
virtual BOOL renameItem(const std::string& new_name);
|
||||
virtual BOOL removeItem();
|
||||
virtual BOOL isItemCopyable() const;
|
||||
virtual bool isItemCopyable(bool can_copy_as_link = true) const;
|
||||
// [SL:KB] - Patch: Inventory-Links | Checked: 2013-09-19 (Catznip-3.6)
|
||||
/*virtual*/ bool isItemLinkable() const;
|
||||
// [/SL:KB]
|
||||
|
|
@ -336,7 +336,7 @@ public:
|
|||
virtual BOOL isItemRemovable() const;
|
||||
virtual BOOL isItemMovable() const ;
|
||||
virtual BOOL isUpToDate() const;
|
||||
virtual BOOL isItemCopyable() const;
|
||||
virtual bool isItemCopyable(bool can_copy_as_link = true) const;
|
||||
// [SL:KB] - Patch: Inventory-Links | Checked: 2013-09-19 (Catznip-3.6)
|
||||
/*virtual*/ bool isItemLinkable() const;
|
||||
// [/SL:KB]
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ public:
|
|||
virtual BOOL removeItem();
|
||||
virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch);
|
||||
virtual void move(LLFolderViewModelItem* parent_listener);
|
||||
virtual BOOL isItemCopyable() const;
|
||||
virtual bool isItemCopyable(bool can_copy_as_link = true) const;
|
||||
virtual BOOL copyToClipboard() const;
|
||||
virtual BOOL cutToClipboard();
|
||||
virtual BOOL isClipboardPasteable() const;
|
||||
|
|
@ -495,10 +495,10 @@ void LLTaskInvFVBridge::move(LLFolderViewModelItem* parent_listener)
|
|||
{
|
||||
}
|
||||
|
||||
BOOL LLTaskInvFVBridge::isItemCopyable() const
|
||||
bool LLTaskInvFVBridge::isItemCopyable(bool can_link) const
|
||||
{
|
||||
LLInventoryItem* item = findItem();
|
||||
if(!item) return FALSE;
|
||||
if(!item) return false;
|
||||
return gAgent.allowOperation(PERM_COPY, item->getPermissions(),
|
||||
GP_OBJECT_MANIPULATE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3411,8 +3411,6 @@ void use_circuit_callback(void**, S32 result)
|
|||
void register_viewer_callbacks(LLMessageSystem* msg)
|
||||
{
|
||||
msg->setHandlerFuncFast(_PREHASH_LayerData, process_layer_data );
|
||||
msg->setHandlerFuncFast(_PREHASH_ImageData, LLViewerTextureList::receiveImageHeader );
|
||||
msg->setHandlerFuncFast(_PREHASH_ImagePacket, LLViewerTextureList::receiveImagePacket );
|
||||
msg->setHandlerFuncFast(_PREHASH_ObjectUpdate, process_object_update );
|
||||
msg->setHandlerFunc("ObjectUpdateCompressed", process_compressed_object_update );
|
||||
msg->setHandlerFunc("ObjectUpdateCached", process_cached_object_update );
|
||||
|
|
|
|||
|
|
@ -284,7 +284,6 @@ static const char* e_state_name[] =
|
|||
"LOAD_FROM_TEXTURE_CACHE",
|
||||
"CACHE_POST",
|
||||
"LOAD_FROM_NETWORK",
|
||||
"LOAD_FROM_SIMULATOR",
|
||||
"WAIT_HTTP_RESOURCE",
|
||||
"WAIT_HTTP_RESOURCE2",
|
||||
"SEND_HTTP_REQ",
|
||||
|
|
@ -458,7 +457,6 @@ public:
|
|||
LOAD_FROM_TEXTURE_CACHE,
|
||||
CACHE_POST,
|
||||
LOAD_FROM_NETWORK,
|
||||
LOAD_FROM_SIMULATOR,
|
||||
WAIT_HTTP_RESOURCE, // Waiting for HTTP resources
|
||||
WAIT_HTTP_RESOURCE2, // Waiting for HTTP resources
|
||||
SEND_HTTP_REQ, // Commit to sending as HTTP
|
||||
|
|
@ -499,8 +497,6 @@ private:
|
|||
// Locks: Mw
|
||||
void clearPackets();
|
||||
|
||||
// Locks: Mw
|
||||
void setupPacketData();
|
||||
|
||||
// Locks: Mw (ctor invokes without lock)
|
||||
U32 calcWorkPriority();
|
||||
|
|
@ -508,10 +504,6 @@ private:
|
|||
// Locks: Mw
|
||||
void removeFromCache();
|
||||
|
||||
// Threads: Ttf
|
||||
// Locks: Mw
|
||||
bool processSimulatorPackets();
|
||||
|
||||
// Threads: Ttf
|
||||
bool writeToCacheComplete();
|
||||
|
||||
|
|
@ -614,8 +606,7 @@ private:
|
|||
BOOL mHaveAllData;
|
||||
BOOL mInLocalCache;
|
||||
BOOL mInCache;
|
||||
bool mCanUseHTTP,
|
||||
mCanUseNET ; //can get from asset server.
|
||||
bool mCanUseHTTP;
|
||||
S32 mRetryAttempt;
|
||||
S32 mActiveCount;
|
||||
LLCore::HttpStatus mGetStatus;
|
||||
|
|
@ -887,7 +878,6 @@ const char* sStateDescs[] = {
|
|||
"LOAD_FROM_TEXTURE_CACHE",
|
||||
"CACHE_POST",
|
||||
"LOAD_FROM_NETWORK",
|
||||
"LOAD_FROM_SIMULATOR",
|
||||
"WAIT_HTTP_RESOURCE",
|
||||
"WAIT_HTTP_RESOURCE2",
|
||||
"SEND_HTTP_REQ",
|
||||
|
|
@ -899,7 +889,7 @@ const char* sStateDescs[] = {
|
|||
"DONE"
|
||||
};
|
||||
|
||||
const std::set<S32> LOGGED_STATES = { LLTextureFetchWorker::LOAD_FROM_TEXTURE_CACHE, LLTextureFetchWorker::LOAD_FROM_NETWORK, LLTextureFetchWorker::LOAD_FROM_SIMULATOR,
|
||||
const std::set<S32> LOGGED_STATES = { LLTextureFetchWorker::LOAD_FROM_TEXTURE_CACHE, LLTextureFetchWorker::LOAD_FROM_NETWORK,
|
||||
LLTextureFetchWorker::WAIT_HTTP_REQ, LLTextureFetchWorker::DECODE_IMAGE_UPDATE, LLTextureFetchWorker::WAIT_ON_WRITE };
|
||||
|
||||
// static
|
||||
|
|
@ -974,8 +964,6 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
|
|||
mResourceWaitCount(0U),
|
||||
mFetchRetryPolicy(10.0,3600.0,2.0,10)
|
||||
{
|
||||
mCanUseNET = mUrl.empty() ;
|
||||
|
||||
calcWorkPriority();
|
||||
mType = host.isOk() ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL;
|
||||
// LL_INFOS(LOG_TXT) << "Create: " << mID << " mHost:" << host << " Discard=" << discard << LL_ENDL;
|
||||
|
|
@ -1039,39 +1027,6 @@ void LLTextureFetchWorker::clearPackets()
|
|||
mFirstPacket = 0;
|
||||
}
|
||||
|
||||
// Locks: Mw
|
||||
void LLTextureFetchWorker::setupPacketData()
|
||||
{
|
||||
S32 data_size = 0;
|
||||
if (mFormattedImage.notNull())
|
||||
{
|
||||
data_size = mFormattedImage->getDataSize();
|
||||
}
|
||||
if (data_size > 0)
|
||||
{
|
||||
// Only used for simulator requests
|
||||
mFirstPacket = (data_size - FIRST_PACKET_SIZE) / MAX_IMG_PACKET_SIZE + 1;
|
||||
if (FIRST_PACKET_SIZE + (mFirstPacket-1) * MAX_IMG_PACKET_SIZE != data_size)
|
||||
{
|
||||
LL_WARNS(LOG_TXT) << "Bad CACHED TEXTURE size: " << data_size << " removing." << LL_ENDL;
|
||||
removeFromCache();
|
||||
resetFormattedData();
|
||||
clearPackets();
|
||||
}
|
||||
else if (mFileSize > 0)
|
||||
{
|
||||
mLastPacket = mFirstPacket-1;
|
||||
mTotalPackets = (mFileSize - FIRST_PACKET_SIZE + MAX_IMG_PACKET_SIZE-1) / MAX_IMG_PACKET_SIZE + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// This file was cached using HTTP so we have to refetch the first packet
|
||||
resetFormattedData();
|
||||
clearPackets();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Locks: Mw (ctor invokes without lock)
|
||||
U32 LLTextureFetchWorker::calcWorkPriority()
|
||||
{
|
||||
|
|
@ -1179,13 +1134,13 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||
|
||||
if(mImagePriority < F_ALMOST_ZERO)
|
||||
{
|
||||
if (mState == INIT || mState == LOAD_FROM_NETWORK || mState == LOAD_FROM_SIMULATOR)
|
||||
if (mState == INIT || mState == LOAD_FROM_NETWORK)
|
||||
{
|
||||
LL_DEBUGS(LOG_TXT) << mID << " abort: mImagePriority < F_ALMOST_ZERO" << LL_ENDL;
|
||||
return true; // abort
|
||||
}
|
||||
}
|
||||
if(mState > CACHE_POST && !mCanUseNET && !mCanUseHTTP)
|
||||
if(mState > CACHE_POST && !mCanUseHTTP)
|
||||
{
|
||||
//nowhere to get data, abort.
|
||||
LL_WARNS(LOG_TXT) << mID << " abort, nowhere to get data" << LL_ENDL;
|
||||
|
|
@ -1428,14 +1383,14 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||
else
|
||||
{
|
||||
mCanUseHTTP = false ;
|
||||
LL_DEBUGS(LOG_TXT) << "Texture not available via HTTP: empty URL." << LL_ENDL;
|
||||
LL_WARNS(LOG_TXT) << "Texture not available via HTTP: empty URL." << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// This will happen if not logged in or if a region deoes not have HTTP Texture enabled
|
||||
//LL_WARNS(LOG_TXT) << "Region not found for host: " << mHost << LL_ENDL;
|
||||
LL_DEBUGS(LOG_TXT) << "Texture not available via HTTP: no region " << mUrl << LL_ENDL;
|
||||
LL_WARNS(LOG_TXT) << "Texture not available via HTTP: no region " << mUrl << LL_ENDL;
|
||||
mCanUseHTTP = false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1454,84 +1409,12 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||
}
|
||||
// don't return, fall through to next state
|
||||
}
|
||||
else if (mSentRequest == UNSENT && mCanUseNET)
|
||||
{
|
||||
// Add this to the network queue and sit here.
|
||||
// LLTextureFetch::update() will send off a request which will change our state
|
||||
mWriteToCacheState = CAN_WRITE ;
|
||||
mRequestedSize = mDesiredSize;
|
||||
mRequestedDiscard = mDesiredDiscard;
|
||||
mSentRequest = QUEUED;
|
||||
mFetcher->addToNetworkQueue(this);
|
||||
recordTextureStart(false);
|
||||
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
|
||||
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Shouldn't need to do anything here
|
||||
//llassert_always(mFetcher->mNetworkQueue.find(mID) != mFetcher->mNetworkQueue.end());
|
||||
// Make certain this is in the network queue
|
||||
//mFetcher->addToNetworkQueue(this);
|
||||
//recordTextureStart(false);
|
||||
//setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (mState == LOAD_FROM_SIMULATOR)
|
||||
{
|
||||
if (mFormattedImage.isNull())
|
||||
{
|
||||
mFormattedImage = new LLImageJ2C;
|
||||
}
|
||||
if (processSimulatorPackets())
|
||||
{
|
||||
// Capture some measure of total size for metrics
|
||||
F64 byte_count = 0;
|
||||
if (mLastPacket >= mFirstPacket)
|
||||
{
|
||||
for (S32 i=mFirstPacket; i<=mLastPacket; i++)
|
||||
{
|
||||
llassert_always((i>=0) && (i<mPackets.size()));
|
||||
if (mPackets[i])
|
||||
{
|
||||
byte_count += mPackets[i]->mSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LL_DEBUGS(LOG_TXT) << mID << ": Loaded from Sim. Bytes: " << mFormattedImage->getDataSize() << LL_ENDL;
|
||||
mFetcher->removeFromNetworkQueue(this, false);
|
||||
if (mFormattedImage.isNull() || !mFormattedImage->getDataSize())
|
||||
{
|
||||
// processSimulatorPackets() failed
|
||||
// LL_WARNS(LOG_TXT) << "processSimulatorPackets() failed to load buffer" << LL_ENDL;
|
||||
LL_WARNS(LOG_TXT) << mID << " processSimulatorPackets() failed to load buffer" << LL_ENDL;
|
||||
return true; // failed
|
||||
}
|
||||
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
|
||||
if (mLoadedDiscard < 0)
|
||||
{
|
||||
LL_WARNS(LOG_TXT) << mID << " mLoadedDiscard is " << mLoadedDiscard
|
||||
<< ", should be >=0" << LL_ENDL;
|
||||
}
|
||||
setState(DECODE_IMAGE);
|
||||
mWriteToCacheState = SHOULD_WRITE;
|
||||
|
||||
recordTextureDone(false, byte_count);
|
||||
}
|
||||
else
|
||||
{
|
||||
mFetcher->addToNetworkQueue(this); // failsafe
|
||||
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
|
||||
recordTextureStart(false);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mState == WAIT_HTTP_RESOURCE)
|
||||
{
|
||||
// NOTE:
|
||||
|
|
@ -1573,8 +1456,6 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||
LL_WARNS(LOG_TXT) << mID << " abort: SEND_HTTP_REQ but !mCanUseHTTP" << LL_ENDL;
|
||||
return true; // abort
|
||||
}
|
||||
|
||||
mFetcher->removeFromNetworkQueue(this, false);
|
||||
|
||||
S32 cur_size = 0;
|
||||
if (mFormattedImage.notNull())
|
||||
|
|
@ -1721,17 +1602,6 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// roll back to try UDP
|
||||
if (mCanUseNET)
|
||||
{
|
||||
setState(INIT);
|
||||
mCanUseHTTP = false;
|
||||
mUrl.clear();
|
||||
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
|
||||
releaseHttpSemaphore();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (http_service_unavail == mGetStatus)
|
||||
{
|
||||
|
|
@ -2300,69 +2170,6 @@ void LLTextureFetchWorker::removeFromCache()
|
|||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Threads: Ttf
|
||||
// Locks: Mw
|
||||
bool LLTextureFetchWorker::processSimulatorPackets()
|
||||
{
|
||||
if (mFormattedImage.isNull() || mRequestedSize < 0)
|
||||
{
|
||||
// not sure how we got here, but not a valid state, abort!
|
||||
llassert_always(mDecodeHandle == 0);
|
||||
mFormattedImage = NULL;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mLastPacket >= mFirstPacket)
|
||||
{
|
||||
S32 buffer_size = mFormattedImage->getDataSize();
|
||||
for (S32 i = mFirstPacket; i<=mLastPacket; i++)
|
||||
{
|
||||
llassert_always((i>=0) && (i<mPackets.size()));
|
||||
llassert_always(mPackets[i]);
|
||||
buffer_size += mPackets[i]->mSize;
|
||||
}
|
||||
bool have_all_data = mLastPacket >= mTotalPackets-1;
|
||||
if (mRequestedSize <= 0)
|
||||
{
|
||||
// We received a packed but haven't requested anything yet (edge case)
|
||||
// Return true (we're "done") since we didn't request anything
|
||||
return true;
|
||||
}
|
||||
if (buffer_size >= mRequestedSize || have_all_data)
|
||||
{
|
||||
/// We have enough (or all) data
|
||||
if (have_all_data)
|
||||
{
|
||||
mHaveAllData = TRUE;
|
||||
}
|
||||
S32 cur_size = mFormattedImage->getDataSize();
|
||||
if (buffer_size > cur_size)
|
||||
{
|
||||
/// We have new data
|
||||
U8* buffer = (U8*)ll_aligned_malloc_16(buffer_size);
|
||||
S32 offset = 0;
|
||||
if (cur_size > 0 && mFirstPacket > 0)
|
||||
{
|
||||
memcpy(buffer, mFormattedImage->getData(), cur_size);
|
||||
offset = cur_size;
|
||||
}
|
||||
for (S32 i=mFirstPacket; i<=mLastPacket; i++)
|
||||
{
|
||||
memcpy(buffer + offset, mPackets[i]->mData, mPackets[i]->mSize);
|
||||
offset += mPackets[i]->mSize;
|
||||
}
|
||||
// NOTE: setData releases current data
|
||||
mFormattedImage->setData(buffer, buffer_size);
|
||||
}
|
||||
mLoadedDiscard = mRequestedDiscard;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Threads: Ttf
|
||||
|
|
@ -2836,40 +2643,6 @@ bool LLTextureFetch::createRequest(FTType f_type, const std::string& url, const
|
|||
}
|
||||
|
||||
|
||||
// Threads: T* (but Ttf in practice)
|
||||
|
||||
// protected
|
||||
void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker)
|
||||
{
|
||||
lockQueue(); // +Mfq
|
||||
bool in_request_map = (mRequestMap.find(worker->mID) != mRequestMap.end()) ;
|
||||
unlockQueue(); // -Mfq
|
||||
|
||||
LLMutexLock lock(&mNetworkQueueMutex); // +Mfnq
|
||||
if (in_request_map)
|
||||
{
|
||||
// only add to the queue if in the request map
|
||||
// i.e. a delete has not been requested
|
||||
mNetworkQueue.insert(worker->mID);
|
||||
}
|
||||
for (cancel_queue_t::iterator iter1 = mCancelQueue.begin();
|
||||
iter1 != mCancelQueue.end(); ++iter1)
|
||||
{
|
||||
iter1->second.erase(worker->mID);
|
||||
}
|
||||
} // -Mfnq
|
||||
|
||||
// Threads: T*
|
||||
void LLTextureFetch::removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel)
|
||||
{
|
||||
LLMutexLock lock(&mNetworkQueueMutex); // +Mfnq
|
||||
size_t erased = mNetworkQueue.erase(worker->mID);
|
||||
if (cancel && erased > 0)
|
||||
{
|
||||
mCancelQueue[worker->mHost].insert(worker->mID);
|
||||
}
|
||||
} // -Mfnq
|
||||
|
||||
// Threads: T*
|
||||
//
|
||||
// protected
|
||||
|
|
@ -2903,7 +2676,6 @@ void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel)
|
|||
unlockQueue(); // -Mfq
|
||||
|
||||
llassert_always(erased_1 > 0) ;
|
||||
removeFromNetworkQueue(worker, cancel);
|
||||
llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
|
||||
|
||||
worker->scheduleDelete();
|
||||
|
|
@ -2931,7 +2703,6 @@ void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
|
|||
unlockQueue(); // -Mfq
|
||||
|
||||
llassert_always(erased_1 > 0) ;
|
||||
removeFromNetworkQueue(worker, cancel);
|
||||
llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
|
||||
|
||||
worker->scheduleDelete();
|
||||
|
|
@ -3220,17 +2991,6 @@ S32 LLTextureFetch::update(F32 max_time_ms)
|
|||
|
||||
S32 res = LLWorkerThread::update(max_time_ms);
|
||||
|
||||
if (!mDebugPause)
|
||||
{
|
||||
// this is the startup state when send_complete_agent_movement() message is sent.
|
||||
// Before this, the RequestImages message sent by sendRequestListToSimulators
|
||||
// won't work so don't bother trying
|
||||
if (LLStartUp::getStartupState() > STATE_AGENT_SEND)
|
||||
{
|
||||
sendRequestListToSimulators();
|
||||
}
|
||||
}
|
||||
|
||||
if (!mThreaded)
|
||||
{
|
||||
commonUpdate();
|
||||
|
|
@ -3321,202 +3081,6 @@ void LLTextureFetch::threadedUpdate()
|
|||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Threads: Tmain
|
||||
void LLTextureFetch::sendRequestListToSimulators()
|
||||
{
|
||||
// All requests
|
||||
const F32 REQUEST_DELTA_TIME = 0.10f; // 10 fps
|
||||
|
||||
// Sim requests
|
||||
const S32 IMAGES_PER_REQUEST = 50;
|
||||
const F32 SIM_LAZY_FLUSH_TIMEOUT = 10.0f; // temp
|
||||
const F32 MIN_REQUEST_TIME = 1.0f;
|
||||
const F32 MIN_DELTA_PRIORITY = 1000.f;
|
||||
|
||||
// Periodically, gather the list of textures that need data from the network
|
||||
// And send the requests out to the simulators
|
||||
static LLFrameTimer timer;
|
||||
if (timer.getElapsedTimeF32() < REQUEST_DELTA_TIME)
|
||||
{
|
||||
return;
|
||||
}
|
||||
timer.reset();
|
||||
|
||||
// Send requests
|
||||
typedef std::set<LLTextureFetchWorker*,LLTextureFetchWorker::Compare> request_list_t;
|
||||
typedef std::map< LLHost, request_list_t > work_request_map_t;
|
||||
work_request_map_t requests;
|
||||
{
|
||||
LLMutexLock lock2(&mNetworkQueueMutex); // +Mfnq
|
||||
for (queue_t::iterator iter = mNetworkQueue.begin(); iter != mNetworkQueue.end(); )
|
||||
{
|
||||
queue_t::iterator curiter = iter++;
|
||||
LLTextureFetchWorker* req = getWorker(*curiter);
|
||||
if (!req)
|
||||
{
|
||||
mNetworkQueue.erase(curiter);
|
||||
continue; // paranoia
|
||||
}
|
||||
if ((req->mState != LLTextureFetchWorker::LOAD_FROM_NETWORK) &&
|
||||
(req->mState != LLTextureFetchWorker::LOAD_FROM_SIMULATOR))
|
||||
{
|
||||
// We already received our URL, remove from the queue
|
||||
LL_WARNS(LOG_TXT) << "Worker: " << req->mID << " in mNetworkQueue but in wrong state: " << req->mState << LL_ENDL;
|
||||
mNetworkQueue.erase(curiter);
|
||||
continue;
|
||||
}
|
||||
if (req->mID == mDebugID)
|
||||
{
|
||||
mDebugCount++; // for setting breakpoints
|
||||
}
|
||||
if (req->mSentRequest == LLTextureFetchWorker::SENT_SIM &&
|
||||
req->mTotalPackets > 0 &&
|
||||
req->mLastPacket >= req->mTotalPackets-1)
|
||||
{
|
||||
// We have all the packets... make sure this is high priority
|
||||
// req->setPriority(LLWorkerThread::PRIORITY_HIGH | req->mWorkPriority);
|
||||
continue;
|
||||
}
|
||||
F32 elapsed = req->mRequestedDeltaTimer.getElapsedTimeF32();
|
||||
{
|
||||
F32 delta_priority = llabs(req->mRequestedPriority - req->mImagePriority);
|
||||
if ((req->mSimRequestedDiscard != req->mDesiredDiscard) ||
|
||||
(delta_priority > MIN_DELTA_PRIORITY && elapsed >= MIN_REQUEST_TIME) ||
|
||||
(elapsed >= SIM_LAZY_FLUSH_TIMEOUT))
|
||||
{
|
||||
requests[req->mHost].insert(req);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // -Mfnq
|
||||
|
||||
for (work_request_map_t::iterator iter1 = requests.begin();
|
||||
iter1 != requests.end(); ++iter1)
|
||||
{
|
||||
LLHost host = iter1->first;
|
||||
// invalid host = use agent host
|
||||
if (host.isInvalid())
|
||||
{
|
||||
host = gAgent.getRegionHost();
|
||||
}
|
||||
|
||||
S32 sim_request_count = 0;
|
||||
|
||||
for (request_list_t::iterator iter2 = iter1->second.begin();
|
||||
iter2 != iter1->second.end(); ++iter2)
|
||||
{
|
||||
LLTextureFetchWorker* req = *iter2;
|
||||
if (gMessageSystem)
|
||||
{
|
||||
if (req->mSentRequest != LLTextureFetchWorker::SENT_SIM)
|
||||
{
|
||||
// Initialize packet data based on data read from cache
|
||||
req->lockWorkMutex(); // +Mw
|
||||
req->setupPacketData();
|
||||
req->unlockWorkMutex(); // -Mw
|
||||
}
|
||||
if (0 == sim_request_count)
|
||||
{
|
||||
gMessageSystem->newMessageFast(_PREHASH_RequestImage);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
}
|
||||
S32 packet = req->mLastPacket + 1;
|
||||
gMessageSystem->nextBlockFast(_PREHASH_RequestImage);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_Image, req->mID);
|
||||
gMessageSystem->addS8Fast(_PREHASH_DiscardLevel, (S8)req->mDesiredDiscard);
|
||||
gMessageSystem->addF32Fast(_PREHASH_DownloadPriority, req->mImagePriority);
|
||||
gMessageSystem->addU32Fast(_PREHASH_Packet, packet);
|
||||
gMessageSystem->addU8Fast(_PREHASH_Type, req->mType);
|
||||
// LL_INFOS(LOG_TXT) << "IMAGE REQUEST: " << req->mID << " Discard: " << req->mDesiredDiscard
|
||||
// << " Packet: " << packet << " Priority: " << req->mImagePriority << LL_ENDL;
|
||||
|
||||
static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog", false);
|
||||
static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator", false);
|
||||
if (log_to_viewer_log || log_to_sim)
|
||||
{
|
||||
mTextureInfo.setRequestStartTime(req->mID, LLTimer::getTotalTime());
|
||||
mTextureInfo.setRequestOffset(req->mID, 0);
|
||||
mTextureInfo.setRequestSize(req->mID, 0);
|
||||
mTextureInfo.setRequestType(req->mID, LLTextureInfoDetails::REQUEST_TYPE_UDP);
|
||||
}
|
||||
|
||||
req->lockWorkMutex(); // +Mw
|
||||
req->mSentRequest = LLTextureFetchWorker::SENT_SIM;
|
||||
req->mSimRequestedDiscard = req->mDesiredDiscard;
|
||||
req->mRequestedPriority = req->mImagePriority;
|
||||
req->mRequestedDeltaTimer.reset();
|
||||
req->unlockWorkMutex(); // -Mw
|
||||
sim_request_count++;
|
||||
if (sim_request_count >= IMAGES_PER_REQUEST)
|
||||
{
|
||||
// LL_INFOS(LOG_TXT) << "REQUESTING " << sim_request_count << " IMAGES FROM HOST: " << host.getIPString() << LL_ENDL;
|
||||
|
||||
gMessageSystem->sendSemiReliable(host, NULL, NULL);
|
||||
sim_request_count = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (gMessageSystem && sim_request_count > 0 && sim_request_count < IMAGES_PER_REQUEST)
|
||||
{
|
||||
// LL_INFOS(LOG_TXT) << "REQUESTING " << sim_request_count << " IMAGES FROM HOST: " << host.getIPString() << LL_ENDL;
|
||||
gMessageSystem->sendSemiReliable(host, NULL, NULL);
|
||||
sim_request_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Send cancelations
|
||||
{
|
||||
LLMutexLock lock2(&mNetworkQueueMutex); // +Mfnq
|
||||
if (gMessageSystem && !mCancelQueue.empty())
|
||||
{
|
||||
for (cancel_queue_t::iterator iter1 = mCancelQueue.begin();
|
||||
iter1 != mCancelQueue.end(); ++iter1)
|
||||
{
|
||||
LLHost host = iter1->first;
|
||||
if (host.isInvalid())
|
||||
{
|
||||
host = gAgent.getRegionHost();
|
||||
}
|
||||
S32 request_count = 0;
|
||||
for (queue_t::iterator iter2 = iter1->second.begin();
|
||||
iter2 != iter1->second.end(); ++iter2)
|
||||
{
|
||||
if (0 == request_count)
|
||||
{
|
||||
gMessageSystem->newMessageFast(_PREHASH_RequestImage);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
}
|
||||
gMessageSystem->nextBlockFast(_PREHASH_RequestImage);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_Image, *iter2);
|
||||
gMessageSystem->addS8Fast(_PREHASH_DiscardLevel, -1);
|
||||
gMessageSystem->addF32Fast(_PREHASH_DownloadPriority, 0);
|
||||
gMessageSystem->addU32Fast(_PREHASH_Packet, 0);
|
||||
gMessageSystem->addU8Fast(_PREHASH_Type, 0);
|
||||
// LL_INFOS(LOG_TXT) << "CANCELING IMAGE REQUEST: " << (*iter2) << LL_ENDL;
|
||||
|
||||
request_count++;
|
||||
if (request_count >= IMAGES_PER_REQUEST)
|
||||
{
|
||||
gMessageSystem->sendSemiReliable(host, NULL, NULL);
|
||||
request_count = 0;
|
||||
}
|
||||
}
|
||||
if (request_count > 0 && request_count < IMAGES_PER_REQUEST)
|
||||
{
|
||||
gMessageSystem->sendSemiReliable(host, NULL, NULL);
|
||||
}
|
||||
}
|
||||
mCancelQueue.clear();
|
||||
}
|
||||
} // -Mfnq
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Threads: T*
|
||||
// Locks: Mw
|
||||
bool LLTextureFetchWorker::insertPacket(S32 index, U8* data, S32 size)
|
||||
|
|
@ -3579,138 +3143,6 @@ void LLTextureFetchWorker::setState(e_state new_state)
|
|||
mState = new_state;
|
||||
}
|
||||
|
||||
// Threads: T*
|
||||
bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes,
|
||||
U16 data_size, U8* data)
|
||||
{
|
||||
LLTextureFetchWorker* worker = getWorker(id);
|
||||
bool res = true;
|
||||
|
||||
++mPacketCount;
|
||||
|
||||
if (!worker)
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "Received header for non active worker: " << id << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
else if (worker->mState != LLTextureFetchWorker::LOAD_FROM_NETWORK ||
|
||||
worker->mSentRequest != LLTextureFetchWorker::SENT_SIM)
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "receiveImageHeader for worker: " << id
|
||||
// << " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState]
|
||||
// << " sent: " << worker->mSentRequest << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
else if (worker->mLastPacket != -1)
|
||||
{
|
||||
// check to see if we've gotten this packet before
|
||||
// LL_WARNS(LOG_TXT) << "Received duplicate header for: " << id << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
else if (!data_size)
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "Img: " << id << ":" << " Empty Image Header" << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
if (!res)
|
||||
{
|
||||
mNetworkQueueMutex.lock(); // +Mfnq
|
||||
++mBadPacketCount;
|
||||
mCancelQueue[host].insert(id);
|
||||
mNetworkQueueMutex.unlock(); // -Mfnq
|
||||
return false;
|
||||
}
|
||||
|
||||
LLViewerStatsRecorder::instance().textureFetch(data_size);
|
||||
LLViewerStatsRecorder::instance().log(0.1f);
|
||||
|
||||
worker->lockWorkMutex();
|
||||
|
||||
|
||||
// Copy header data into image object
|
||||
worker->mImageCodec = codec;
|
||||
worker->mTotalPackets = packets;
|
||||
worker->mFileSize = (S32)totalbytes;
|
||||
llassert_always(totalbytes > 0);
|
||||
llassert_always(data_size == FIRST_PACKET_SIZE || data_size == worker->mFileSize);
|
||||
res = worker->insertPacket(0, data, data_size);
|
||||
worker->setPriority(LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority);
|
||||
worker->setState(LLTextureFetchWorker::LOAD_FROM_SIMULATOR);
|
||||
worker->unlockWorkMutex(); // -Mw
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
// Threads: T*
|
||||
bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data)
|
||||
{
|
||||
LLTextureFetchWorker* worker = getWorker(id);
|
||||
bool res = true;
|
||||
|
||||
++mPacketCount;
|
||||
|
||||
if (!worker)
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "Received packet " << packet_num << " for non active worker: " << id << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
else if (worker->mLastPacket == -1)
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "Received packet " << packet_num << " before header for: " << id << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
else if (!data_size)
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "Img: " << id << ":" << " Empty Image Header" << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
if (!res)
|
||||
{
|
||||
mNetworkQueueMutex.lock(); // +Mfnq
|
||||
++mBadPacketCount;
|
||||
mCancelQueue[host].insert(id);
|
||||
mNetworkQueueMutex.unlock(); // -Mfnq
|
||||
return false;
|
||||
}
|
||||
|
||||
LLViewerStatsRecorder::instance().textureFetch(data_size);
|
||||
LLViewerStatsRecorder::instance().log(0.1f);
|
||||
|
||||
worker->lockWorkMutex();
|
||||
|
||||
|
||||
res = worker->insertPacket(packet_num, data, data_size);
|
||||
|
||||
if ((worker->mState == LLTextureFetchWorker::LOAD_FROM_SIMULATOR) ||
|
||||
(worker->mState == LLTextureFetchWorker::LOAD_FROM_NETWORK))
|
||||
{
|
||||
worker->setPriority(LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority);
|
||||
worker->setState(LLTextureFetchWorker::LOAD_FROM_SIMULATOR);
|
||||
}
|
||||
else
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "receiveImagePacket " << packet_num << "/" << worker->mLastPacket << " for worker: " << id
|
||||
// << " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState] << LL_ENDL;
|
||||
removeFromNetworkQueue(worker, true); // failsafe
|
||||
}
|
||||
|
||||
if (packet_num >= (worker->mTotalPackets - 1))
|
||||
{
|
||||
static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog", false);
|
||||
static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator", false);
|
||||
|
||||
if (log_to_viewer_log || log_to_sim)
|
||||
{
|
||||
U64Microseconds timeNow = LLTimer::getTotalTime();
|
||||
mTextureInfoMainThread.setRequestSize(id, worker->mFileSize);
|
||||
mTextureInfoMainThread.setRequestCompleteTimeAndLog(id, timeNow);
|
||||
}
|
||||
}
|
||||
worker->unlockWorkMutex(); // -Mw
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Threads: T*
|
||||
|
|
@ -3749,13 +3181,7 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r
|
|||
request_dtime = worker->mRequestedDeltaTimer.getElapsedTimeF32();
|
||||
if (worker->mFileSize > 0)
|
||||
{
|
||||
if (state == LLTextureFetchWorker::LOAD_FROM_SIMULATOR)
|
||||
{
|
||||
S32 data_size = FIRST_PACKET_SIZE + (worker->mLastPacket-1) * MAX_IMG_PACKET_SIZE;
|
||||
data_size = llmax(data_size, 0);
|
||||
data_progress = (F32)data_size / (F32)worker->mFileSize;
|
||||
}
|
||||
else if (worker->mFormattedImage.notNull())
|
||||
if (worker->mFormattedImage.notNull())
|
||||
{
|
||||
data_progress = (F32)worker->mFormattedImage->getDataSize() / (F32)worker->mFileSize;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -101,12 +101,6 @@ public:
|
|||
// Threads: T*
|
||||
bool updateRequestPriority(const LLUUID& id, F32 priority);
|
||||
|
||||
// Threads: T*
|
||||
bool receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes, U16 data_size, U8* data);
|
||||
|
||||
// Threads: T*
|
||||
bool receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data);
|
||||
|
||||
// Threads: T* (but not safe)
|
||||
void setTextureBandwidth(F32 bandwidth) { mTextureBandwidth = bandwidth; }
|
||||
|
||||
|
|
@ -227,12 +221,6 @@ public:
|
|||
// ----------------------------------
|
||||
|
||||
protected:
|
||||
// Threads: T* (but Ttf in practice)
|
||||
void addToNetworkQueue(LLTextureFetchWorker* worker);
|
||||
|
||||
// Threads: T*
|
||||
void removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel);
|
||||
|
||||
// Threads: T*
|
||||
void addToHTTPQueue(const LLUUID& id);
|
||||
|
||||
|
|
@ -251,9 +239,6 @@ protected:
|
|||
bool runCondition();
|
||||
|
||||
private:
|
||||
// Threads: Tmain
|
||||
void sendRequestListToSimulators();
|
||||
|
||||
// Threads: Ttf
|
||||
/*virtual*/ void startThread(void);
|
||||
|
||||
|
|
@ -319,7 +304,7 @@ public:
|
|||
|
||||
private:
|
||||
LLMutex mQueueMutex; //to protect mRequestMap and mCommands only
|
||||
LLMutex mNetworkQueueMutex; //to protect mNetworkQueue, mHTTPTextureQueue and mCancelQueue.
|
||||
LLMutex mNetworkQueueMutex; //to protect mHTTPTextureQueue
|
||||
|
||||
LLTextureCache* mTextureCache;
|
||||
LLImageDecodeThread* mImageDecodeThread;
|
||||
|
|
@ -330,10 +315,8 @@ private:
|
|||
|
||||
// Set of requests that require network data
|
||||
typedef std::set<LLUUID> queue_t;
|
||||
queue_t mNetworkQueue; // Mfnq
|
||||
queue_t mHTTPTextureQueue; // Mfnq
|
||||
typedef std::map<LLHost,std::set<LLUUID> > cancel_queue_t;
|
||||
cancel_queue_t mCancelQueue; // Mfnq
|
||||
F32 mTextureBandwidth; // <none>
|
||||
F32 mMaxBandwidth; // Mfnq
|
||||
LLTextureInfo mTextureInfo;
|
||||
|
|
|
|||
|
|
@ -236,7 +236,6 @@ void LLTextureBar::draw()
|
|||
{ "CCH", LLColor4::cyan }, // LOAD_FROM_TEXTURE_CACHE
|
||||
{ "DSK", LLColor4::blue }, // CACHE_POST
|
||||
{ "NET", LLColor4::green }, // LOAD_FROM_NETWORK
|
||||
{ "SIM", LLColor4::green }, // LOAD_FROM_SIMULATOR
|
||||
{ "HTW", LLColor4::green }, // WAIT_HTTP_RESOURCE
|
||||
// <FS:Ansariel> Unique state codes
|
||||
//{ "HTW", LLColor4::green }, // WAIT_HTTP_RESOURCE2
|
||||
|
|
|
|||
|
|
@ -2046,7 +2046,7 @@ void LLViewerParcelMgr::optionallyStartMusic(const std::string &music_url, const
|
|||
// only play music when you enter a new parcel if the UI control for this
|
||||
// was not *explicitly* stopped by the user. (part of SL-4878)
|
||||
// <FS> Media/Stream separation
|
||||
//LLPanelNearByMedia* nearby_media_panel = gStatusBar->getNearbyMediaPanel();
|
||||
//LLPanelNearByMedia* nearby_media_panel = gStatusBar ? gStatusBar->getNearbyMediaPanel() : NULL;
|
||||
LLViewerAudio* viewer_audio = LLViewerAudio::getInstance();
|
||||
|
||||
// ask mode //todo constants
|
||||
|
|
|
|||
|
|
@ -1760,152 +1760,6 @@ void LLViewerTextureList::updateTexMemDynamic()
|
|||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// static
|
||||
void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_data)
|
||||
{
|
||||
static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic", false) ;
|
||||
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
|
||||
|
||||
// Receive image header, copy into image object and decompresses
|
||||
// if this is a one-packet image.
|
||||
|
||||
LLUUID id;
|
||||
|
||||
char ip_string[256];
|
||||
u32_to_ip_string(msg->getSenderIP(),ip_string);
|
||||
|
||||
U32Bytes received_size ;
|
||||
if (msg->getReceiveCompressedSize())
|
||||
{
|
||||
received_size = (U32Bytes)msg->getReceiveCompressedSize() ;
|
||||
}
|
||||
else
|
||||
{
|
||||
received_size = (U32Bytes)msg->getReceiveSize() ;
|
||||
}
|
||||
add(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED, received_size);
|
||||
add(LLStatViewer::TEXTURE_PACKETS, 1);
|
||||
|
||||
U8 codec;
|
||||
U16 packets;
|
||||
U32 totalbytes;
|
||||
msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, id);
|
||||
msg->getU8Fast(_PREHASH_ImageID, _PREHASH_Codec, codec);
|
||||
msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packets, packets);
|
||||
msg->getU32Fast(_PREHASH_ImageID, _PREHASH_Size, totalbytes);
|
||||
|
||||
S32 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data);
|
||||
if (!data_size)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (data_size < 0)
|
||||
{
|
||||
// msg->getSizeFast() is probably trying to tell us there
|
||||
// was an error.
|
||||
LL_ERRS() << "image header chunk size was negative: "
|
||||
<< data_size << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
// this buffer gets saved off in the packet list
|
||||
U8 *data = new U8[data_size];
|
||||
msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size);
|
||||
|
||||
LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
|
||||
if (!image)
|
||||
{
|
||||
delete [] data;
|
||||
return;
|
||||
}
|
||||
if(log_texture_traffic)
|
||||
{
|
||||
gTotalTextureBytesPerBoostLevel[image->getBoostLevel()] += received_size ;
|
||||
}
|
||||
|
||||
//image->getLastPacketTimer()->reset();
|
||||
bool res = LLAppViewer::getTextureFetch()->receiveImageHeader(msg->getSender(), id, codec, packets, totalbytes, data_size, data);
|
||||
if (!res)
|
||||
{
|
||||
delete[] data;
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_data)
|
||||
{
|
||||
static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic", false) ;
|
||||
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
|
||||
|
||||
// Receives image packet, copy into image object,
|
||||
// checks if all packets received, decompresses if so.
|
||||
|
||||
LLUUID id;
|
||||
U16 packet_num;
|
||||
|
||||
char ip_string[256];
|
||||
u32_to_ip_string(msg->getSenderIP(),ip_string);
|
||||
|
||||
U32Bytes received_size ;
|
||||
if (msg->getReceiveCompressedSize())
|
||||
{
|
||||
received_size = (U32Bytes)msg->getReceiveCompressedSize() ;
|
||||
}
|
||||
else
|
||||
{
|
||||
received_size = (U32Bytes)msg->getReceiveSize() ;
|
||||
}
|
||||
|
||||
add(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED, F64Bytes(received_size));
|
||||
add(LLStatViewer::TEXTURE_PACKETS, 1);
|
||||
|
||||
//llprintline("Start decode, image header...");
|
||||
msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, id);
|
||||
msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packet, packet_num);
|
||||
S32 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data);
|
||||
|
||||
if (!data_size)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (data_size < 0)
|
||||
{
|
||||
// msg->getSizeFast() is probably trying to tell us there
|
||||
// was an error.
|
||||
LL_ERRS() << "image data chunk size was negative: "
|
||||
<< data_size << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
if (data_size > MTUBYTES)
|
||||
{
|
||||
LL_ERRS() << "image data chunk too large: " << data_size << " bytes" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
U8 *data = new U8[data_size];
|
||||
msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size);
|
||||
|
||||
LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
|
||||
if (!image)
|
||||
{
|
||||
delete [] data;
|
||||
return;
|
||||
}
|
||||
if(log_texture_traffic)
|
||||
{
|
||||
gTotalTextureBytesPerBoostLevel[image->getBoostLevel()] += received_size ;
|
||||
}
|
||||
|
||||
//image->getLastPacketTimer()->reset();
|
||||
bool res = LLAppViewer::getTextureFetch()->receiveImagePacket(msg->getSender(), id, packet_num, data_size, data);
|
||||
if (!res)
|
||||
{
|
||||
delete[] data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// We've been that the asset server does not contain the requested image id.
|
||||
// static
|
||||
void LLViewerTextureList::processImageNotInDatabase(LLMessageSystem *msg,void **user_data)
|
||||
|
|
|
|||
|
|
@ -96,8 +96,6 @@ public:
|
|||
static BOOL createUploadFile(const std::string& filename, const std::string& out_filename, const U8 codec);
|
||||
static LLPointer<LLImageJ2C> convertToUploadFile(LLPointer<LLImageRaw> raw_image);
|
||||
static void processImageNotInDatabase( LLMessageSystem *msg, void **user_data );
|
||||
static void receiveImageHeader(LLMessageSystem *msg, void **user_data);
|
||||
static void receiveImagePacket(LLMessageSystem *msg, void **user_data);
|
||||
|
||||
public:
|
||||
LLViewerTextureList();
|
||||
|
|
|
|||
|
|
@ -1928,15 +1928,20 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)
|
|||
void LLPipeline::removeMutedAVsLights(LLVOAvatar* muted_avatar)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
|
||||
for (light_set_t::iterator iter = gPipeline.mNearbyLights.begin();
|
||||
iter != gPipeline.mNearbyLights.end(); iter++)
|
||||
{
|
||||
if (iter->drawable->getVObj()->isAttachment() && iter->drawable->getVObj()->getAvatar() == muted_avatar)
|
||||
{
|
||||
gPipeline.mLights.erase(iter->drawable);
|
||||
gPipeline.mNearbyLights.erase(iter);
|
||||
}
|
||||
}
|
||||
light_set_t::iterator iter = gPipeline.mNearbyLights.begin();
|
||||
|
||||
while (iter != gPipeline.mNearbyLights.end())
|
||||
{
|
||||
if (iter->drawable->getVObj()->isAttachment() && iter->drawable->getVObj()->getAvatar() == muted_avatar)
|
||||
{
|
||||
gPipeline.mLights.erase(iter->drawable);
|
||||
iter = gPipeline.mNearbyLights.erase(iter);
|
||||
}
|
||||
else
|
||||
{
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U32 LLPipeline::addObject(LLViewerObject *vobj)
|
||||
|
|
|
|||
Loading…
Reference in New Issue