diff --git a/autobuild.xml b/autobuild.xml index 3f6859e867..2491098981 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -3334,9 +3334,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 60f008c5fd31641ad4e61ac751ce15d1 + 7d59c592a937988cb1d0b7eddc11c7c5 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75748/723495/uriparser-0.9.4-darwin64-555117.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81641/768120/uriparser-0.9.4-darwin64-559421.tar.bz2 name darwin64 @@ -3370,9 +3370,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 00aff37a6f5e1fe08456702d28706cf6 + 0ea100b4a9c906100b1bcc68b852e98e url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75751/723507/uriparser-0.9.4-windows-555117.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81650/768175/uriparser-0.9.4-windows-559421.tar.bz2 name windows @@ -3382,9 +3382,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - ff27a91f3941c7bef5e1613a064cb048 + 0789d651ef5636236b5ffc5089d8dc49 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75750/723506/uriparser-0.9.4-windows64-555117.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81651/768176/uriparser-0.9.4-windows64-559421.tar.bz2 name windows64 diff --git a/doc/contributions.txt b/doc/contributions.txt index 947fe19cfb..089f7a4ed9 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -1102,6 +1102,7 @@ Nicky Dasmijn OPEN-187 STORM-1937 OPEN-187 + SL-15234 STORM-2010 STORM-2082 MAINT-6665 diff --git a/indra/llcommon/llmetricperformancetester.cpp b/indra/llcommon/llmetricperformancetester.cpp index f8a93baf45..100eb57555 100644 --- a/indra/llcommon/llmetricperformancetester.cpp +++ b/indra/llcommon/llmetricperformancetester.cpp @@ -189,7 +189,6 @@ LLMetricPerformanceTesterBasic::~LLMetricPerformanceTesterBasic() void LLMetricPerformanceTesterBasic::preOutputTestResults(LLSD* sd) { incrementCurrentCount() ; - (*sd)[getCurrentLabelName()]["Name"] = mName ; } void LLMetricPerformanceTesterBasic::postOutputTestResults(LLSD* sd) diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index 6c6f819415..06ae9593e8 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -81,8 +81,29 @@ protected: }; + +class LLPluginProcessCreationThread : public LLThread +{ +public: + LLPluginProcessCreationThread(LLPluginProcessParent *parent) : + LLThread("LLPluginProcessCreationThread", gAPRPoolp), + pParent(parent) + { + } +protected: + // Inherited from LLThread, should run once + /*virtual*/ void run(void) + { + pParent->createPluginProcess(); + } +private: + LLPluginProcessParent *pParent; + +}; + LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner): - mIncomingQueueMutex() + mIncomingQueueMutex(), + pProcessCreationThread(NULL) { if(!sInstancesMutex) { @@ -111,6 +132,18 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner): LLPluginProcessParent::~LLPluginProcessParent() { LL_DEBUGS("Plugin") << "destructor" << LL_ENDL; + if (pProcessCreationThread) + { + if (!pProcessCreationThread->isStopped()) + { + // Shouldn't happen at this stage + LL_WARNS("Plugin") << "Shutting down active pProcessCreationThread" << LL_ENDL; + pProcessCreationThread->shutdown(); + ms_sleep(20); + } + delete pProcessCreationThread; + pProcessCreationThread = NULL; + } // Destroy any remaining shared memory regions sharedMemoryRegionsType::iterator iter; @@ -320,6 +353,35 @@ bool LLPluginProcessParent::accept() return result; } +bool LLPluginProcessParent::createPluginProcess() +{ + if (!mProcess) + { + // Only argument to the launcher is the port number we're listening on + mProcessParams.args.add(stringize(mBoundPort)); + mProcess = LLProcess::create(mProcessParams); + return mProcess != NULL; + } + + return false; +} + +void LLPluginProcessParent::clearProcessCreationThread() +{ + if (pProcessCreationThread) + { + if (!pProcessCreationThread->isStopped()) + { + pProcessCreationThread->shutdown(); + } + else + { + delete pProcessCreationThread; + pProcessCreationThread = NULL; + } + } +} + void LLPluginProcessParent::idle(void) { bool idle_again; @@ -327,8 +389,9 @@ void LLPluginProcessParent::idle(void) do { // process queued messages - mIncomingQueueMutex.lock(); - while(!mIncomingQueue.empty()) + // Inside main thread, it is preferable not to block it on mutex. + bool locked = mIncomingQueueMutex.trylock(); + while(locked && !mIncomingQueue.empty()) { LLPluginMessage message = mIncomingQueue.front(); mIncomingQueue.pop(); @@ -336,10 +399,13 @@ void LLPluginProcessParent::idle(void) receiveMessage(message); - mIncomingQueueMutex.lock(); + locked = mIncomingQueueMutex.trylock(); } - mIncomingQueueMutex.unlock(); + if (locked) + { + mIncomingQueueMutex.unlock(); + } // Give time to network processing if(mMessagePipe) @@ -487,15 +553,30 @@ void LLPluginProcessParent::idle(void) case STATE_LISTENING: { // Launch the plugin process. + if (mDebug && !pProcessCreationThread) + { + createPluginProcess(); + if (!mProcess) + { + errorState(); + } + } + else if (pProcessCreationThread == NULL) + { + // exe plugin process allocation can be hindered by a number + // of factors, don't hold whole viewer because of it, use thread + pProcessCreationThread = new LLPluginProcessCreationThread(this); + pProcessCreationThread->start(); + } + else if (!mProcess && pProcessCreationThread->isStopped()) + { + delete pProcessCreationThread; + pProcessCreationThread = NULL; + errorState(); + } + - // Only argument to the launcher is the port number we're listening on - mProcessParams.args.add(stringize(mBoundPort)); - - if (! (mProcess = LLProcess::create(mProcessParams))) - { - errorState(); - } - else + if (mProcess) { if(mDebug) { @@ -524,6 +605,15 @@ void LLPluginProcessParent::idle(void) // This will allow us to time out if the process never starts. mHeartbeat.start(); mHeartbeat.setTimerExpirySec(mPluginLaunchTimeout); + + // pProcessCreationThread should have stopped by this point, + // but check just in case it paused on statistics sync + if (pProcessCreationThread && pProcessCreationThread->isStopped()) + { + delete pProcessCreationThread; + pProcessCreationThread = NULL; + } + setState(STATE_LAUNCHED); } } @@ -626,6 +716,7 @@ void LLPluginProcessParent::idle(void) killSockets(); setState(STATE_DONE); dirtyPollSet(); + clearProcessCreationThread(); break; case STATE_DONE: diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h index 7fde43a149..b70dff86c3 100644 --- a/indra/llplugin/llpluginprocessparent.h +++ b/indra/llplugin/llpluginprocessparent.h @@ -69,6 +69,11 @@ public: const std::string &plugin_filename, bool debug); + // Creates a process + // returns true if process already exists or if created, + // false if failed to create + bool createPluginProcess(); + void idle(void); // returns true if the plugin is on its way to steady state @@ -163,12 +168,15 @@ private: bool accept(); + void clearProcessCreationThread(); + LLSocket::ptr_t mListenSocket; LLSocket::ptr_t mSocket; U32 mBoundPort; LLProcess::Params mProcessParams; LLProcessPtr mProcess; + LLThread *pProcessCreationThread; std::string mPluginFile; std::string mPluginDir; diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index ef008e0a81..d8edfac562 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -1293,6 +1293,14 @@ bool LLModel::needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt ) // // larger than original and if we keep going, reordering will cause a crash // return false; // } + + if (mMaterialList.size() > ref->mMaterialList.size()) + { + LL_INFOS("MESHSKININFO") << "Material of model has more materials than a reference." << LL_ENDL; + // We passed isMaterialListSubset, so materials are a subset, but subset isn't supposed to be + // larger than original and if we keep going, reordering will cause a crash + return false; + } // std::map index_map; diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index cea1e11f07..5e8760b56e 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -575,6 +575,58 @@ void LLFloaterReg::toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD& } } +// static +// Same as toggleInstanceOrBringToFront but does not close floater. +// unlike showInstance() does not trigger onOpen() if already open +void LLFloaterReg::showInstanceOrBringToFront(const LLSD& sdname, const LLSD& key) +{ + std::string name = sdname.asString(); + LLFloater* instance = getInstance(name, key); + + + if (!instance) + { + LL_DEBUGS() << "Unable to get instance of floater '" << name << "'" << LL_ENDL; + return; + } + + // If hosted, we need to take that into account + LLFloater* host = instance->getHost(); + + if (host) + { + if (host->isMinimized() || !host->isShown() || !host->isFrontmost()) + { + host->setMinimized(FALSE); + instance->openFloater(key); + instance->setVisibleAndFrontmost(true, key); + } + else if (!instance->getVisible()) + { + instance->openFloater(key); + instance->setVisibleAndFrontmost(true, key); + instance->setFocus(TRUE); + } + } + else + { + if (instance->isMinimized()) + { + instance->setMinimized(FALSE); + instance->setVisibleAndFrontmost(true, key); + } + else if (!instance->isShown()) + { + instance->openFloater(key); + instance->setVisibleAndFrontmost(true, key); + } + else if (!instance->isFrontmost()) + { + instance->setVisibleAndFrontmost(true, key); + } + } +} + // static U32 LLFloaterReg::getVisibleFloaterInstanceCount() { diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h index 0ab610906b..b93ac3b7a1 100644 --- a/indra/llui/llfloaterreg.h +++ b/indra/llui/llfloaterreg.h @@ -157,6 +157,7 @@ public: // Callback wrappers static void toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD& key = LLSD()); + static void showInstanceOrBringToFront(const LLSD& sdname, const LLSD& key = LLSD()); // Typed find / get / show template diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 34d8ed6fef..86da070eaa 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1710,6 +1710,20 @@ void LLNotifications::add(const LLNotificationPtr pNotif) updateItem(LLSD().with("sigtype", "add").with("id", pNotif->id()), pNotif); } +void LLNotifications::load(const LLNotificationPtr pNotif) +{ + if (pNotif == NULL) return; + + // first see if we already have it -- if so, that's a problem + LLNotificationSet::iterator it=mItems.find(pNotif); + if (it != mItems.end()) + { + LL_ERRS() << "Notification loaded a second time to the master notification channel." << LL_ENDL; + } + + updateItem(LLSD().with("sigtype", "load").with("id", pNotif->id()), pNotif); +} + void LLNotifications::cancel(LLNotificationPtr pNotif) { if (pNotif == NULL || pNotif->isCancelled()) return; diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 8ec04d2bd5..152c53a979 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -933,6 +933,7 @@ public: LLNotificationPtr add(const LLNotification::Params& p); void add(const LLNotificationPtr pNotif); + void load(const LLNotificationPtr pNotif); void cancel(LLNotificationPtr pNotif); void cancelByName(const std::string& name); void cancelByOwner(const LLUUID ownerId); @@ -1136,6 +1137,11 @@ private: mHistory.push_back(p); } + void onLoad(LLNotificationPtr p) + { + mHistory.push_back(p); + } + std::vector mHistory; }; diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp index 13839da400..8dd552d2ad 100644 --- a/indra/llui/llscrolllistcell.cpp +++ b/indra/llui/llscrolllistcell.cpp @@ -79,6 +79,14 @@ const LLSD LLScrollListCell::getValue() const return LLStringUtil::null; } + +// virtual +const LLSD LLScrollListCell::getAltValue() const +{ + return LLStringUtil::null; +} + + // // LLScrollListIcon // @@ -173,6 +181,7 @@ U32 LLScrollListText::sCount = 0; LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p) : LLScrollListCell(p), mText(p.label.isProvided() ? p.label() : p.value().asString()), + mAltText(p.alt_value().asString()), mFont(p.font), mColor(p.color), mUseColor(p.color.isProvided()), @@ -275,10 +284,22 @@ void LLScrollListText::setValue(const LLSD& text) setText(text.asString()); } +//virtual +void LLScrollListText::setAltValue(const LLSD& text) +{ + mAltText = text.asString(); +} + //virtual const LLSD LLScrollListText::getValue() const { - return LLSD(mText.getString()); + return LLSD(mText.getString()); +} + +//virtual +const LLSD LLScrollListText::getAltValue() const +{ + return LLSD(mAltText.getString()); } diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h index 19576fb247..ede8d847d9 100644 --- a/indra/llui/llscrolllistcell.h +++ b/indra/llui/llscrolllistcell.h @@ -60,6 +60,7 @@ public: Optional userdata; Optional value; // state of checkbox, icon id/name, date + Optional alt_value; Optional label; // description or text Optional tool_tip; @@ -76,6 +77,7 @@ public: enabled("enabled", true), visible("visible", true), value("value"), + alt_value("alt_value", ""), label("label"), tool_tip("tool_tip", ""), font("font", LLFontGL::getFontSansSerifSmall()), @@ -98,7 +100,9 @@ public: virtual S32 getContentWidth() const { return 0; } virtual S32 getHeight() const { return 0; } virtual const LLSD getValue() const; + virtual const LLSD getAltValue() const; virtual void setValue(const LLSD& value) { } + virtual void setAltValue(const LLSD& value) { } virtual const std::string &getToolTip() const { return mToolTip; } virtual void setToolTip(const std::string &str) { mToolTip = str; } virtual BOOL getVisible() const { return TRUE; } @@ -138,7 +142,9 @@ public: /*virtual*/ S32 getContentWidth() const; /*virtual*/ S32 getHeight() const; /*virtual*/ void setValue(const LLSD& value); + /*virtual*/ void setAltValue(const LLSD& value); /*virtual*/ const LLSD getValue() const; + /*virtual*/ const LLSD getAltValue() const; /*virtual*/ BOOL getVisible() const; /*virtual*/ void highlightText(S32 offset, S32 num_chars); @@ -156,6 +162,7 @@ public: protected: LLUIString mText; + LLUIString mAltText; S32 mTextWidth; const LLFontGL* mFont; LLColor4 mColor; diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index f1501cbd73..fb48be372e 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -68,9 +68,10 @@ static LLDefaultChildRegistry::Register r("scroll_list"); // local structures & classes. struct SortScrollListItem { - SortScrollListItem(const std::vector >& sort_orders,const LLScrollListCtrl::sort_signal_t* sort_signal) + SortScrollListItem(const std::vector >& sort_orders,const LLScrollListCtrl::sort_signal_t* sort_signal, bool alternate_sort) : mSortOrders(sort_orders) , mSortSignal(sort_signal) + , mAltSort(alternate_sort) {} bool operator()(const LLScrollListItem* i1, const LLScrollListItem* i2) @@ -95,7 +96,14 @@ struct SortScrollListItem } else { - sort_result = order * LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString()); + if (mAltSort && !cell1->getAltValue().asString().empty() && !cell2->getAltValue().asString().empty()) + { + sort_result = order * LLStringUtil::compareDict(cell1->getAltValue().asString(), cell2->getAltValue().asString()); + } + else + { + sort_result = order * LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString()); + } } if (sort_result != 0) { @@ -111,6 +119,7 @@ struct SortScrollListItem typedef std::vector > sort_order_t; const LLScrollListCtrl::sort_signal_t* mSortSignal; const sort_order_t& mSortOrders; + const bool mAltSort; }; //--------------------------------------------------------------------------- @@ -219,6 +228,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p) mSearchColumn(p.search_column), mColumnPadding(p.column_padding), mRowPadding(p.row_padding), + mAlternateSort(false), mContextMenuType(MENU_NONE), mIsFriendSignal(NULL), // Fix for FS-specific people list (radar) @@ -3098,7 +3108,7 @@ void LLScrollListCtrl::updateSort() const std::stable_sort( mItemList.begin(), mItemList.end(), - SortScrollListItem(mSortColumns,mSortCallback)); + SortScrollListItem(mSortColumns,mSortCallback, mAlternateSort)); mSorted = true; } @@ -3114,7 +3124,7 @@ void LLScrollListCtrl::sortOnce(S32 column, BOOL ascending) std::stable_sort( mItemList.begin(), mItemList.end(), - SortScrollListItem(sort_column,mSortCallback)); + SortScrollListItem(sort_column,mSortCallback,mAlternateSort)); } void LLScrollListCtrl::dirtyColumns() diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index af00f56db5..99ffa2a94f 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -421,6 +421,8 @@ public: BOOL hasSortOrder() const; void clearSortOrder(); + void setAlternateSort() { mAlternateSort = true; } + S32 selectMultiple( uuid_vec_t ids ); // conceptually const, but mutates mItemList void updateSort() const; @@ -519,6 +521,8 @@ private: bool mColumnsDirty; bool mColumnWidthsDirty; + bool mAlternateSort; + mutable item_list mItemList; LLScrollListItem *mLastSelected; diff --git a/indra/llui/llscrolllistitem.cpp b/indra/llui/llscrolllistitem.cpp index 51c615dd00..e1360f80cd 100644 --- a/indra/llui/llscrolllistitem.cpp +++ b/indra/llui/llscrolllistitem.cpp @@ -44,7 +44,8 @@ LLScrollListItem::LLScrollListItem( const Params& p ) mSelectedIndex(-1), mEnabled(p.enabled), mUserdata(p.userdata), - mItemValue(p.value) + mItemValue(p.value), + mItemAltValue(p.alt_value) { } diff --git a/indra/llui/llscrolllistitem.h b/indra/llui/llscrolllistitem.h index d2c3dd7721..a3398305b1 100644 --- a/indra/llui/llscrolllistitem.h +++ b/indra/llui/llscrolllistitem.h @@ -55,6 +55,7 @@ public: Optional enabled; Optional userdata; Optional value; + Optional alt_value; Ignored name; // use for localization tools Ignored type; @@ -65,6 +66,7 @@ public: Params() : enabled("enabled", true), value("value"), + alt_value("alt_value"), name("name"), type("type"), length("length"), @@ -97,6 +99,7 @@ public: virtual LLUUID getUUID() const { return mItemValue.asUUID(); } LLSD getValue() const { return mItemValue; } + LLSD getAltValue() const { return mItemAltValue; } void setRect(LLRect rect) { mRectangle = rect; } LLRect getRect() const { return mRectangle; } @@ -131,6 +134,7 @@ private: BOOL mEnabled; void* mUserdata; LLSD mItemValue; + LLSD mItemAltValue; std::vector mColumns; LLRect mRectangle; }; diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 493060886c..b407f4a3df 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -197,6 +197,7 @@ mHelpImpl(NULL) reg.add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleInstance, _2, LLSD())); reg.add("Floater.ToggleOrBringToFront", boost::bind(&LLFloaterReg::toggleInstanceOrBringToFront, _2, LLSD())); reg.add("Floater.Show", boost::bind(&LLFloaterReg::showInstance, _2, LLSD(), FALSE)); + reg.add("Floater.ShowOrBringToFront", boost::bind(&LLFloaterReg::showInstanceOrBringToFront, _2, LLSD())); reg.add("Floater.Hide", boost::bind(&LLFloaterReg::hideInstance, _2, LLSD())); // Button initialization callback for toggle buttons diff --git a/indra/llwindow/llcursortypes.cpp b/indra/llwindow/llcursortypes.cpp index 86f4d898bc..c5db67532d 100644 --- a/indra/llwindow/llcursortypes.cpp +++ b/indra/llwindow/llcursortypes.cpp @@ -42,6 +42,7 @@ ECursorType getCursorFromString(const std::string& cursor_string) cursor_string_table["UI_CURSOR_SIZENESW"] = UI_CURSOR_SIZENESW; cursor_string_table["UI_CURSOR_SIZEWE"] = UI_CURSOR_SIZEWE; cursor_string_table["UI_CURSOR_SIZENS"] = UI_CURSOR_SIZENS; + cursor_string_table["UI_CURSOR_SIZEALL"] = UI_CURSOR_SIZEALL; cursor_string_table["UI_CURSOR_NO"] = UI_CURSOR_NO; cursor_string_table["UI_CURSOR_WORKING"] = UI_CURSOR_WORKING; cursor_string_table["UI_CURSOR_TOOLGRAB"] = UI_CURSOR_TOOLGRAB; @@ -61,6 +62,7 @@ ECursorType getCursorFromString(const std::string& cursor_string) cursor_string_table["UI_CURSOR_TOOLCAMERA"] = UI_CURSOR_TOOLCAMERA; cursor_string_table["UI_CURSOR_TOOLPAN"] = UI_CURSOR_TOOLPAN; cursor_string_table["UI_CURSOR_TOOLZOOMIN"] = UI_CURSOR_TOOLZOOMIN; + cursor_string_table["UI_CURSOR_TOOLZOOMOUT"] = UI_CURSOR_TOOLZOOMOUT; cursor_string_table["UI_CURSOR_TOOLPICKOBJECT3"] = UI_CURSOR_TOOLPICKOBJECT3; cursor_string_table["UI_CURSOR_TOOLPLAY"] = UI_CURSOR_TOOLPLAY; cursor_string_table["UI_CURSOR_TOOLPAUSE"] = UI_CURSOR_TOOLPAUSE; diff --git a/indra/llwindow/llcursortypes.h b/indra/llwindow/llcursortypes.h index 73f3fe6cdf..10bd38d448 100644 --- a/indra/llwindow/llcursortypes.h +++ b/indra/llwindow/llcursortypes.h @@ -38,6 +38,7 @@ enum ECursorType { UI_CURSOR_SIZENESW, UI_CURSOR_SIZEWE, UI_CURSOR_SIZENS, + UI_CURSOR_SIZEALL, UI_CURSOR_NO, UI_CURSOR_WORKING, UI_CURSOR_TOOLGRAB, @@ -57,6 +58,7 @@ enum ECursorType { UI_CURSOR_TOOLCAMERA, UI_CURSOR_TOOLPAN, UI_CURSOR_TOOLZOOMIN, + UI_CURSOR_TOOLZOOMOUT, UI_CURSOR_TOOLPICKOBJECT3, UI_CURSOR_TOOLPLAY, UI_CURSOR_TOOLPAUSE, diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index b342cef457..2fd38e4703 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -1434,6 +1434,7 @@ const char* cursorIDToName(int id) case UI_CURSOR_SIZENESW: return "UI_CURSOR_SIZENESW"; case UI_CURSOR_SIZEWE: return "UI_CURSOR_SIZEWE"; case UI_CURSOR_SIZENS: return "UI_CURSOR_SIZENS"; + case UI_CURSOR_SIZEALL: return "UI_CURSOR_SIZEALL"; case UI_CURSOR_NO: return "UI_CURSOR_NO"; case UI_CURSOR_WORKING: return "UI_CURSOR_WORKING"; case UI_CURSOR_TOOLGRAB: return "UI_CURSOR_TOOLGRAB"; @@ -1453,6 +1454,7 @@ const char* cursorIDToName(int id) case UI_CURSOR_TOOLCAMERA: return "UI_CURSOR_TOOLCAMERA"; case UI_CURSOR_TOOLPAN: return "UI_CURSOR_TOOLPAN"; case UI_CURSOR_TOOLZOOMIN: return "UI_CURSOR_TOOLZOOMIN"; + case UI_CURSOR_TOOLZOOMOUT: return "UI_CURSOR_TOOLZOOMOUT"; case UI_CURSOR_TOOLPICKOBJECT3: return "UI_CURSOR_TOOLPICKOBJECT3"; case UI_CURSOR_TOOLPLAY: return "UI_CURSOR_TOOLPLAY"; case UI_CURSOR_TOOLPAUSE: return "UI_CURSOR_TOOLPAUSE"; diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index c6c9eff376..e73180e338 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -2107,6 +2107,7 @@ void LLWindowSDL::initCursors(BOOL useLegacyCursors) // Legacy cursor se mSDLCursors[UI_CURSOR_SIZENESW] = makeSDLCursorFromBMP("sizenesw.BMP",17,17); mSDLCursors[UI_CURSOR_SIZEWE] = makeSDLCursorFromBMP("sizewe.BMP",16,14); mSDLCursors[UI_CURSOR_SIZENS] = makeSDLCursorFromBMP("sizens.BMP",17,16); + mSDLCursors[UI_CURSOR_SIZEALL] = makeSDLCursorFromBMP("sizeall.BMP", 17, 17); mSDLCursors[UI_CURSOR_NO] = makeSDLCursorFromBMP("llno.BMP",8,8); mSDLCursors[UI_CURSOR_WORKING] = makeSDLCursorFromBMP("working.BMP",12,15); mSDLCursors[UI_CURSOR_TOOLGRAB] = makeSDLCursorFromBMP("lltoolgrab.BMP",2,13); @@ -2126,6 +2127,7 @@ void LLWindowSDL::initCursors(BOOL useLegacyCursors) // Legacy cursor se mSDLCursors[UI_CURSOR_TOOLCAMERA] = makeSDLCursorFromBMP("lltoolcamera.BMP",7,5); mSDLCursors[UI_CURSOR_TOOLPAN] = makeSDLCursorFromBMP("lltoolpan.BMP",7,5); mSDLCursors[UI_CURSOR_TOOLZOOMIN] = makeSDLCursorFromBMP("lltoolzoomin.BMP",7,5); + mSDLCursors[UI_CURSOR_TOOLZOOMOUT] = makeSDLCursorFromBMP("lltoolzoomout.BMP", 7, 5); mSDLCursors[UI_CURSOR_TOOLPICKOBJECT3] = makeSDLCursorFromBMP("toolpickobject3.BMP",0,0); mSDLCursors[UI_CURSOR_TOOLPLAY] = makeSDLCursorFromBMP("toolplay.BMP",0,0); mSDLCursors[UI_CURSOR_TOOLPAUSE] = makeSDLCursorFromBMP("toolpause.BMP",0,0); diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index d2d24bb730..005d5e25ac 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -1918,8 +1918,9 @@ void LLWindowWin32::initCursors(BOOL useLegacyCursors) // Legacy cursor mCursor[ UI_CURSOR_CROSS ] = LoadCursor(NULL, IDC_CROSS); mCursor[ UI_CURSOR_SIZENWSE ] = LoadCursor(NULL, IDC_SIZENWSE); mCursor[ UI_CURSOR_SIZENESW ] = LoadCursor(NULL, IDC_SIZENESW); - mCursor[ UI_CURSOR_SIZEWE ] = LoadCursor(NULL, IDC_SIZEWE); - mCursor[ UI_CURSOR_SIZENS ] = LoadCursor(NULL, IDC_SIZENS); + mCursor[ UI_CURSOR_SIZEWE ] = LoadCursor(NULL, IDC_SIZEWE); + mCursor[ UI_CURSOR_SIZENS ] = LoadCursor(NULL, IDC_SIZENS); + mCursor[ UI_CURSOR_SIZEALL ] = LoadCursor(NULL, IDC_SIZEALL); mCursor[ UI_CURSOR_NO ] = LoadCursor(NULL, IDC_NO); mCursor[ UI_CURSOR_WORKING ] = LoadCursor(NULL, IDC_APPSTARTING); @@ -1941,6 +1942,7 @@ void LLWindowWin32::initCursors(BOOL useLegacyCursors) // Legacy cursor mCursor[ UI_CURSOR_TOOLCAMERA ] = LoadCursor(module, TEXT("TOOLCAMERA")); mCursor[ UI_CURSOR_TOOLPAN ] = LoadCursor(module, TEXT("TOOLPAN")); mCursor[ UI_CURSOR_TOOLZOOMIN ] = LoadCursor(module, TEXT("TOOLZOOMIN")); + mCursor[ UI_CURSOR_TOOLZOOMOUT ] = LoadCursor(module, TEXT("TOOLZOOMOUT")); mCursor[ UI_CURSOR_TOOLPICKOBJECT3 ] = LoadCursor(module, TEXT("TOOLPICKOBJECT3")); mCursor[ UI_CURSOR_PIPETTE ] = LoadCursor(module, TEXT("TOOLPIPETTE")); /* Legacy cursor setting from main program diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp index bbd3c85ec1..0e2651f1a7 100644 --- a/indra/media_plugins/cef/media_plugin_cef.cpp +++ b/indra/media_plugins/cef/media_plugin_cef.cpp @@ -393,21 +393,86 @@ void MediaPluginCEF::onCursorChangedCallback(dullahan::ECursorType type) switch (type) { - case dullahan::CT_POINTER: - name = "arrow"; - break; + case dullahan::CT_POINTER: + name = "UI_CURSOR_ARROW"; + break; + case dullahan::CT_CROSS: + name = "UI_CURSOR_CROSS"; + break; + case dullahan::CT_HAND: + name = "UI_CURSOR_HAND"; + break; case dullahan::CT_IBEAM: - name = "ibeam"; - break; - case dullahan::CT_NORTHSOUTHRESIZE: - name = "splitv"; - break; - case dullahan::CT_EASTWESTRESIZE: - name = "splith"; - break; - case dullahan::CT_HAND: - name = "hand"; + name = "UI_CURSOR_IBEAM"; break; + case dullahan::CT_WAIT: + name = "UI_CURSOR_WAIT"; + break; + //case dullahan::CT_HELP: + case dullahan::CT_ROWRESIZE: + case dullahan::CT_NORTHRESIZE: + case dullahan::CT_SOUTHRESIZE: + case dullahan::CT_NORTHSOUTHRESIZE: + name = "UI_CURSOR_SIZENS"; + break; + case dullahan::CT_COLUMNRESIZE: + case dullahan::CT_EASTRESIZE: + case dullahan::CT_WESTRESIZE: + case dullahan::CT_EASTWESTRESIZE: + name = "UI_CURSOR_SIZEWE"; + break; + case dullahan::CT_NORTHEASTRESIZE: + case dullahan::CT_SOUTHWESTRESIZE: + case dullahan::CT_NORTHEASTSOUTHWESTRESIZE: + name = "UI_CURSOR_SIZENESW"; + break; + case dullahan::CT_SOUTHEASTRESIZE: + case dullahan::CT_NORTHWESTRESIZE: + case dullahan::CT_NORTHWESTSOUTHEASTRESIZE: + name = "UI_CURSOR_SIZENWSE"; + break; + case dullahan::CT_MOVE: + name = "UI_CURSOR_SIZEALL"; + break; + //case dullahan::CT_MIDDLEPANNING: + //case dullahan::CT_EASTPANNING: + //case dullahan::CT_NORTHPANNING: + //case dullahan::CT_NORTHEASTPANNING: + //case dullahan::CT_NORTHWESTPANNING: + //case dullahan::CT_SOUTHPANNING: + //case dullahan::CT_SOUTHEASTPANNING: + //case dullahan::CT_SOUTHWESTPANNING: + //case dullahan::CT_WESTPANNING: + //case dullahan::CT_VERTICALTEXT: + //case dullahan::CT_CELL: + //case dullahan::CT_CONTEXTMENU: + case dullahan::CT_ALIAS: + name = "UI_CURSOR_TOOLMEDIAOPEN"; + break; + case dullahan::CT_PROGRESS: + name = "UI_CURSOR_WORKING"; + break; + case dullahan::CT_COPY: + name = "UI_CURSOR_ARROWCOPY"; + break; + case dullahan::CT_NONE: + name = "UI_CURSOR_NO"; + break; + case dullahan::CT_NODROP: + case dullahan::CT_NOTALLOWED: + name = "UI_CURSOR_NOLOCKED"; + break; + case dullahan::CT_ZOOMIN: + name = "UI_CURSOR_TOOLZOOMIN"; + break; + case dullahan::CT_ZOOMOUT: + name = "UI_CURSOR_TOOLZOOMOUT"; + break; + case dullahan::CT_GRAB: + name = "UI_CURSOR_TOOLGRAB"; + break; + //case dullahan::CT_GRABING: + //case dullahan::CT_CUSTOM: default: LL_WARNS() << "Unknown cursor ID: " << (int)type << LL_ENDL; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 90dfad49fb..4f165ee737 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -15673,6 +15673,17 @@ Change of this parameter will affect the layout of buttons in notification toast Backup 0 + TextureFetchMinTimeToLog + + Comment + If texture fetching time exceeds this value, texture fetch tester will log info + Persist + 1 + Type + F32 + Value + 2.0 + TextureFetchFakeFailureRate Comment @@ -15775,6 +15786,17 @@ Change of this parameter will affect the layout of buttons in notification toast Backup 0 + TextureListFetchingThreshold + + Comment + If the ratio between fetched and all textures in the list is greater than this threshold, which we assume that almost all textures are fetched + Persist + 1 + Type + F32 + Value + 0.97 + TextureLoadFullRes Comment diff --git a/indra/newview/cursors_mac/UI_CURSOR_SIZEALL.tif b/indra/newview/cursors_mac/UI_CURSOR_SIZEALL.tif new file mode 100644 index 0000000000..85fec76fca Binary files /dev/null and b/indra/newview/cursors_mac/UI_CURSOR_SIZEALL.tif differ diff --git a/indra/newview/cursors_mac/UI_CURSOR_TOOLZOOMOUT.tif b/indra/newview/cursors_mac/UI_CURSOR_TOOLZOOMOUT.tif new file mode 100644 index 0000000000..d64a7f2b68 Binary files /dev/null and b/indra/newview/cursors_mac/UI_CURSOR_TOOLZOOMOUT.tif differ diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 990edf51d1..8e0a9b722c 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -4681,16 +4681,6 @@ bool LLAgent::teleportCore(bool is_local) // hide the Region/Estate floater LLFloaterReg::hideInstance("region_info"); - // minimize the Search floater (STORM-1474) - { - LLFloater* instance = LLFloaterReg::getInstance("search"); - - if (instance && instance->getVisible()) - { - instance->setMinimized(TRUE); - } - } - LLViewerParcelMgr::getInstance()->deselectLand(); LLViewerMediaFocus::getInstance()->clearFocus(); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 5ed386fc5d..f3fce76b10 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2030,12 +2030,14 @@ bool LLAppViewer::cleanup() // one because it happens just after mFastTimerLogThread is deleted. This // comment is in case we guessed wrong, so we can move it here instead. +#if LL_LINUX // remove any old breakpad minidump files from the log directory if (! isError()) { std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ""); gDirUtilp->deleteFilesInDir(logdir, "*-*-*-*-*.dmp"); } +#endif // Kill off LLLeap objects. We can find them all because LLLeap is derived // from LLInstanceTracker. @@ -5569,6 +5571,10 @@ void LLAppViewer::idle() // // Special case idle if still starting up // + if (LLStartUp::getStartupState() >= STATE_WORLD_INIT) + { + update_texture_time(); + } if (LLStartUp::getStartupState() < STATE_STARTED) { // Skip rest if idle startup returns false (essentially, no world yet) diff --git a/indra/newview/llbrowsernotification.cpp b/indra/newview/llbrowsernotification.cpp index 0460bff1b4..7614624306 100644 --- a/indra/newview/llbrowsernotification.cpp +++ b/indra/newview/llbrowsernotification.cpp @@ -40,7 +40,7 @@ LLBrowserNotification::LLBrowserNotification() { } -bool LLBrowserNotification::processNotification(const LLNotificationPtr& notification) +bool LLBrowserNotification::processNotification(const LLNotificationPtr& notification, bool should_log) { LLUUID media_id = notification->getPayload()["media_id"].asUUID(); LLMediaCtrl* media_instance = LLMediaCtrl::getInstance(media_id); diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index 3ea58b3067..598678f6ea 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -911,6 +911,7 @@ protected: static bool filterNotification(LLNotificationPtr notify); // connect counter updaters to the corresponding signals /*virtual*/ void onAdd(LLNotificationPtr p) { mChiclet->setCounter(++mChiclet->mUreadSystemNotifications); } + /*virtual*/ void onLoad(LLNotificationPtr p) { mChiclet->setCounter(++mChiclet->mUreadSystemNotifications); } /*virtual*/ void onDelete(LLNotificationPtr p) { mChiclet->setCounter(--mChiclet->mUreadSystemNotifications); } LLNotificationChiclet* const mChiclet; diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 1d2b587d3f..ea01b94767 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -386,13 +386,16 @@ void LLFloaterIMSessionTab::draw() void LLFloaterIMSessionTab::enableDisableCallBtn() { - mVoiceButton->setEnabled( - mSessionID.notNull() - && mSession - && mSession->mSessionInitialized - && LLVoiceClient::getInstance()->voiceEnabled() - && LLVoiceClient::getInstance()->isVoiceWorking() - && mSession->mCallBackEnabled); + if (LLVoiceClient::instanceExists()) + { + mVoiceButton->setEnabled( + mSessionID.notNull() + && mSession + && mSession->mSessionInitialized + && LLVoiceClient::getInstance()->voiceEnabled() + && LLVoiceClient::getInstance()->isVoiceWorking() + && mSession->mCallBackEnabled); + } } void LLFloaterIMSessionTab::onFocusReceived() diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 54ab5f77cd..f20339bfb9 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2679,6 +2679,7 @@ BOOL LLPanelLandAccess::postBuild() //mListBanned->setContextMenu(LLScrollListCtrl::MENU_AVATAR); mListBanned->setContextMenu(&gFSNameListAvatarMenu); // + mListBanned->setAlternateSort(); } return TRUE; @@ -2781,11 +2782,12 @@ void LLPanelLandAccess::refresh() { const LLAccessEntry& entry = (*cit).second; std::string duration; + S32 seconds = -1; if (entry.mTime != 0) { LLStringUtil::format_map_t args; S32 now = time(NULL); - S32 seconds = entry.mTime - now; + seconds = entry.mTime - now; if (seconds < 0) seconds = 0; if (seconds >= 7200) @@ -2822,6 +2824,7 @@ void LLPanelLandAccess::refresh() columns[0]["column"] = "name"; // to be populated later columns[1]["column"] = "duration"; columns[1]["value"] = duration; + columns[1]["alt_value"] = entry.mTime != 0 ? std::to_string(seconds) : "Always"; mListBanned->addElement(item); } mListBanned->sortByName(TRUE); diff --git a/indra/newview/llfloaterlandholdings.cpp b/indra/newview/llfloaterlandholdings.cpp index 749a3d2686..8633fe4e5e 100644 --- a/indra/newview/llfloaterlandholdings.cpp +++ b/indra/newview/llfloaterlandholdings.cpp @@ -108,6 +108,9 @@ LLFloaterLandHoldings::~LLFloaterLandHoldings() void LLFloaterLandHoldings::onOpen(const LLSD& key) { + LLScrollListCtrl *list = getChild("parcel list"); + list->clearRows(); + // query_id null is known to be us const LLUUID& query_id = LLUUID::null; diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index edd3a57595..e81eb6573f 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -391,7 +391,7 @@ void LLFloaterModelPreview::initModelPreview() mModelPreview = new LLModelPreview(tex_width, tex_height, this); mModelPreview->setPreviewTarget(PREVIEW_CAMERA_DISTANCE); - mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5)); + mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3)); mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::modelUpdated, this, _1)); } @@ -899,9 +899,6 @@ void LLFloaterModelPreview::draw() } } - childSetTextArg("prim_cost", "[PRIM_COST]", llformat("%d", mModelPreview->mResourceCost)); - childSetTextArg("description_label", "[TEXTURES]", llformat("%d", mModelPreview->mTextureSet.size())); - if (!isMinimized() && mModelPreview->lodsReady()) { draw3dPreview(); @@ -1661,7 +1658,7 @@ void LLFloaterModelPreview::addStringToLogTab(const std::string& str, bool flash } } -void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost) +void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z) { assert_main_thread(); childSetTextArg("import_dimensions", "[X]", llformat("%.3f", x)); @@ -1834,9 +1831,20 @@ void LLFloaterModelPreview::toggleCalculateButton(bool visible) void LLFloaterModelPreview::onLoDSourceCommit(S32 lod) { mModelPreview->updateLodControls(lod); - refresh(); LLComboBox* lod_source_combo = getChild("lod_source_" + lod_name[lod]); + + if (lod_source_combo->getCurrentIndex() == LLModelPreview::LOD_FROM_FILE + && mModelPreview->mLODFile[lod].empty()) + { + // File wasn't selected, so nothing to do yet, refreshing + // hovewer will cause a small freeze with large meshes + // Might be good idea to open filepicker here + return; + } + + refresh(); + if (lod_source_combo->getCurrentIndex() == LLModelPreview::GENERATE) { //rebuild LoD to update triangle counts onLODParamCommit(lod, true); diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 8a01b0c307..bb8cf1c587 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -90,7 +90,7 @@ public: void clearAvatarTab(); // clears table void updateAvatarTab(bool highlight_overrides); // populates table and data as nessesary - void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost); + void setDetails(F32 x, F32 y, F32 z); void setPreviewLOD(S32 lod); void onBrowseLOD(S32 lod); diff --git a/indra/newview/llfloatertexturefetchdebugger.cpp b/indra/newview/llfloatertexturefetchdebugger.cpp index 9a23d99802..cda4dc8bcc 100644 --- a/indra/newview/llfloatertexturefetchdebugger.cpp +++ b/indra/newview/llfloatertexturefetchdebugger.cpp @@ -38,6 +38,7 @@ #include "llappviewer.h" #include "lltexturefetch.h" #include "llviewercontrol.h" +#include "llviewerassetstats.h" //gTextureTimer LLFloaterTextureFetchDebugger::LLFloaterTextureFetchDebugger(const LLSD& key) : LLFloater(key), @@ -50,6 +51,7 @@ LLFloaterTextureFetchDebugger::LLFloaterTextureFetchDebugger(const LLSD& key) mCommitCallbackRegistrar.add("TexFetchDebugger.Start", boost::bind(&LLFloaterTextureFetchDebugger::onClickStart, this)); mCommitCallbackRegistrar.add("TexFetchDebugger.Clear", boost::bind(&LLFloaterTextureFetchDebugger::onClickClear, this)); mCommitCallbackRegistrar.add("TexFetchDebugger.Close", boost::bind(&LLFloaterTextureFetchDebugger::onClickClose, this)); + mCommitCallbackRegistrar.add("TexFetchDebugger.ResetFetchTime", boost::bind(&LLFloaterTextureFetchDebugger::onClickResetFetchTime, this)); mCommitCallbackRegistrar.add("TexFetchDebugger.CacheRead", boost::bind(&LLFloaterTextureFetchDebugger::onClickCacheRead, this)); mCommitCallbackRegistrar.add("TexFetchDebugger.CacheWrite", boost::bind(&LLFloaterTextureFetchDebugger::onClickCacheWrite, this)); @@ -228,6 +230,12 @@ void LLFloaterTextureFetchDebugger::onClickClose() delete this; } +void LLFloaterTextureFetchDebugger::onClickResetFetchTime() +{ + gTextureTimer.start(); + gTextureTimer.pause(); +} + void LLFloaterTextureFetchDebugger::onClickClear() { mButtonStateMap["start_btn"] = true; diff --git a/indra/newview/llfloatertexturefetchdebugger.h b/indra/newview/llfloatertexturefetchdebugger.h index 096ad88e07..637f3b03e5 100644 --- a/indra/newview/llfloatertexturefetchdebugger.h +++ b/indra/newview/llfloatertexturefetchdebugger.h @@ -44,6 +44,7 @@ public: void onClickStart(); void onClickClear(); void onClickClose(); + void onClickResetFetchTime(); void onClickCacheRead(); void onClickCacheWrite(); diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index ef1897ae30..102aafadb3 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -374,7 +374,7 @@ void LLHUDText::updateVisibility() if (!mSourceObject) { - //LL_WARNS() << "LLHUDText::updateScreenPos -- mSourceObject is NULL!" << LL_ENDL; + LL_WARNS() << "HUD text: mSourceObject is NULL, mOnHUDAttachment: " << mOnHUDAttachment << LL_ENDL; mVisible = TRUE; if (mOnHUDAttachment) { diff --git a/indra/newview/llimhandler.cpp b/indra/newview/llimhandler.cpp index c2b29f36e8..0fa3dc1110 100644 --- a/indra/newview/llimhandler.cpp +++ b/indra/newview/llimhandler.cpp @@ -60,7 +60,7 @@ void LLIMHandler::initChannel() } //-------------------------------------------------------------------------- -bool LLIMHandler::processNotification(const LLNotificationPtr& notification) +bool LLIMHandler::processNotification(const LLNotificationPtr& notification, bool should_log) { if(notification->isDND()) { diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 2a09211517..b1ceffd74e 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1980,7 +1980,7 @@ LLUUID LLIMMgr::computeSessionID( } } - if (gAgent.isInGroup(session_id) && (session_id != other_participant_id)) + if (gAgent.isInGroup(session_id, TRUE) && (session_id != other_participant_id)) { LL_WARNS() << "Group session id different from group id: IM type = " << dialog << ", session id = " << session_id << ", group id = " << other_participant_id << LL_ENDL; } diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index d2715a008c..17ad113339 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -263,7 +263,7 @@ void update_marketplace_folder_hierarchy(const LLUUID cat_id) return; } -void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistency_enforcement) +void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistency_enforcement, bool skip_clear_listing) { // When changing the marketplace status of an item, we usually have to change the status of all // folders in the same listing. This is because the display of each folder is affected by the @@ -335,7 +335,7 @@ void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistenc else { // If the folder is outside the marketplace listings root, clear its SLM data if needs be - if (perform_consistency_enforcement && LLMarketplaceData::instance().isListed(cur_uuid)) + if (perform_consistency_enforcement && !skip_clear_listing && LLMarketplaceData::instance().isListed(cur_uuid)) { LL_INFOS("SLM") << "Disassociate as the listing folder is not under the marketplace folder anymore!!" << LL_ENDL; LLMarketplaceData::instance().clearListing(cur_uuid); @@ -1961,7 +1961,7 @@ bool validate_marketplacelistings(LLInventoryCategory* cat, validation_callback_ result &= validate_marketplacelistings(category, cb, fix_hierarchy, depth + 1); } - update_marketplace_category(cat->getUUID()); + update_marketplace_category(cat->getUUID(), true, true); gInventory.notifyObservers(); return result && !has_bad_items; } diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 01a9757305..5fea97d283 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -72,7 +72,7 @@ void show_item_original(const LLUUID& item_uuid); void reset_inventory_filter(); // Nudge the listing categories in the inventory to signal that their marketplace status changed -void update_marketplace_category(const LLUUID& cat_id, bool perform_consistency_enforcement = true); +void update_marketplace_category(const LLUUID& cat_id, bool perform_consistency_enforcement = true, bool skip_clear_listing = false); // Nudge all listing categories to signal that their marketplace status changed void update_all_marketplace_count(); diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp index 51fae3ffd2..6c89d394ee 100644 --- a/indra/newview/llmarketplacefunctions.cpp +++ b/indra/newview/llmarketplacefunctions.cpp @@ -1026,6 +1026,12 @@ void LLMarketplaceData::createSLMListingCoro(LLUUID folderId, LLUUID versionId, log_SLM_infos("Post /listings", status.getType(), result); + if (!result.has("listings") || !result["listings"].isArray() || result["listings"].size() == 0) + { + LL_INFOS("SLM") << "Received an empty response for folder " << folderId << LL_ENDL; + return; + } + // Extract the info from the results for (LLSD::array_iterator it = result["listings"].beginArray(); it != result["listings"].endArray(); ++it) @@ -1093,6 +1099,19 @@ void LLMarketplaceData::updateSLMListingCoro(LLUUID folderId, S32 listingId, LLU log_SLM_infos("Put /listing", status.getType(), result); + if (!result.has("listings") || !result["listings"].isArray() || result["listings"].size() == 0) + { + LL_INFOS("SLM") << "Received an empty response for listing " << listingId << " folder " << folderId << LL_ENDL; + // Try to get listing more directly after a delay + const float FORCE_UPDATE_TIMEOUT = 5.0; + llcoro::suspendUntilTimeout(FORCE_UPDATE_TIMEOUT); + if (!LLApp::isExiting() && LLMarketplaceData::instanceExists()) + { + getSLMListing(listingId); + } + return; + } + // Extract the info from the Json string for (LLSD::array_iterator it = result["listings"].beginArray(); it != result["listings"].endArray(); ++it) diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index 6409b29e00..2ee86b20c5 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -259,27 +259,14 @@ LLModelPreview::~LLModelPreview() } } -U32 LLModelPreview::calcResourceCost() +void LLModelPreview::updateDimentionsAndOffsets() { assert_main_thread(); rebuildUploadData(); - //Upload skin is selected BUT check to see if the joints coming in from the asset were malformed. - if (mFMP && mFMP->childGetValue("upload_skin").asBoolean()) - { - bool uploadingJointPositions = mFMP->childGetValue("upload_joints").asBoolean(); - if (uploadingJointPositions && !isRigValidForJointPositionUpload()) - { - mFMP->childDisable("ok_btn"); - } - } - std::set accounted; - U32 num_points = 0; - U32 num_hulls = 0; - F32 debug_scale = mFMP ? mFMP->childGetValue("import_scale").asReal() : 1.f; mPelvisZOffset = mFMP ? mFMP->childGetValue("pelvis_offset").asReal() : 3.0f; if (mFMP && mFMP->childGetValue("upload_joints").asBoolean()) @@ -291,8 +278,6 @@ U32 LLModelPreview::calcResourceCost() getPreviewAvatar()->addPelvisFixup(mPelvisZOffset, fake_mesh_id); } - F32 streaming_cost = 0.f; - F32 physics_cost = 0.f; for (U32 i = 0; i < mUploadData.size(); ++i) { LLModelInstance& instance = mUploadData[i]; @@ -301,11 +286,6 @@ U32 LLModelPreview::calcResourceCost() { accounted.insert(instance.mModel); - LLModel::Decomposition& decomp = - instance.mLOD[LLModel::LOD_PHYSICS] ? - instance.mLOD[LLModel::LOD_PHYSICS]->mPhysics : - instance.mModel->mPhysics; - //update instance skin info for each lods pelvisZoffset for (int j = 0; jmSkinInfo.mPelvisOffset = mPelvisZOffset; } } - - std::stringstream ostr; - LLSD ret = LLModel::writeModel(ostr, - instance.mLOD[4], - instance.mLOD[3], - instance.mLOD[2], - instance.mLOD[1], - instance.mLOD[0], - decomp, - mFMP->childGetValue("upload_skin").asBoolean(), - mFMP->childGetValue("upload_joints").asBoolean(), - mFMP->childGetValue("lock_scale_if_joint_position").asBoolean(), - TRUE, - FALSE, - instance.mModel->mSubmodelID); - - num_hulls += decomp.mHull.size(); - for (U32 i = 0; i < decomp.mHull.size(); ++i) - { - num_points += decomp.mHull[i].size(); - } - - //calculate streaming cost - LLMatrix4 transformation = instance.mTransform; - - LLVector3 position = LLVector3(0, 0, 0) * transformation; - - LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position; - LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position; - LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position; - F32 x_length = x_transformed.normalize(); - F32 y_length = y_transformed.normalize(); - F32 z_length = z_transformed.normalize(); - LLVector3 scale = LLVector3(x_length, y_length, z_length); - - F32 radius = scale.length()*0.5f*debug_scale; - - LLMeshCostData costs; - if (gMeshRepo.getCostData(ret, costs)) - { - streaming_cost += costs.getRadiusBasedStreamingCost(radius); - } } } F32 scale = mFMP ? mFMP->childGetValue("import_scale").asReal()*2.f : 2.f; - mDetailsSignal(mPreviewScale[0] * scale, mPreviewScale[1] * scale, mPreviewScale[2] * scale, streaming_cost, physics_cost); + mDetailsSignal((F32)(mPreviewScale[0] * scale), (F32)(mPreviewScale[1] * scale), (F32)(mPreviewScale[2] * scale)); updateStatusMessages(); - - return (U32)streaming_cost; } // relocate from llmodel and rewrite so it does what it is meant to @@ -1942,8 +1878,6 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim } } - mResourceCost = calcResourceCost(); - LLVertexBuffer::unbind(); LLGLSLShader::sNoFixedFunction = no_ff; if (shader) @@ -2913,9 +2847,8 @@ void LLModelPreview::update() if (mDirty && mLodsQuery.empty()) { mDirty = false; - mResourceCost = calcResourceCost(); + updateDimentionsAndOffsets(); refresh(); - updateStatusMessages(); } } @@ -3248,8 +3181,6 @@ BOOL LLModelPreview::render() // auto enable weight upload if weights are present // (note: all these UI updates need to be somewhere that is not render) // BUG-229632 auto enable weights slows manual workflow - // mViewOption["show_skin_weight"] = true; - // skin_weight = true; // fmp->childSetValue("upload_skin", true); LL_DEBUGS("MeshUpload") << "FSU auto_enable_weights_upload = " << auto_enable_weight_upload() << LL_ENDL; LL_DEBUGS("MeshUpload") << "FSU auto_enable_show_weights = " << auto_enable_show_weights() << LL_ENDL; diff --git a/indra/newview/llmodelpreview.h b/indra/newview/llmodelpreview.h index 2cfee9e3cb..7c1a0efb95 100644 --- a/indra/newview/llmodelpreview.h +++ b/indra/newview/llmodelpreview.h @@ -115,7 +115,7 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex { LOG_CLASS(LLModelPreview); - typedef boost::signals2::signal details_signal_t; + typedef boost::signals2::signal details_signal_t; typedef boost::signals2::signal model_loaded_signal_t; typedef boost::signals2::signal model_updated_signal_t; @@ -159,7 +159,7 @@ public: void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false); void generateNormals(); void restoreNormals(); - U32 calcResourceCost(); + void updateDimentionsAndOffsets(); void rebuildUploadData(); void saveUploadData(bool save_skinweights, bool save_joint_positions, bool lock_scale_if_joint_position); void saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_positions, bool lock_scale_if_joint_position); @@ -241,7 +241,6 @@ protected: LLVector3 mPreviewScale; S32 mPreviewLOD; S32 mPhysicsSearchLOD; - U32 mResourceCost; std::string mLODFile[LLModel::NUM_LODS]; bool mLoading; U32 mLoadState; diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index f82595097c..af2821f6f1 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -415,6 +415,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow( if (cell) { cell->setValue(prefix + fullname); + cell->setAltValue(name_item.alt_value()); } dirtyColumns(); diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp index 1058c3836c..e5c0199065 100644 --- a/indra/newview/llnotificationalerthandler.cpp +++ b/indra/newview/llnotificationalerthandler.cpp @@ -73,7 +73,7 @@ void LLAlertHandler::initChannel() } //-------------------------------------------------------------------------- -bool LLAlertHandler::processNotification(const LLNotificationPtr& notification) +bool LLAlertHandler::processNotification(const LLNotificationPtr& notification, bool should_log) { if(mChannel.isDead()) { @@ -146,7 +146,7 @@ LLViewerAlertHandler::LLViewerAlertHandler(const std::string& name, const std::s { } -bool LLViewerAlertHandler::processNotification(const LLNotificationPtr& p) +bool LLViewerAlertHandler::processNotification(const LLNotificationPtr& p, bool should_log) { if (gHeadlessClient) { diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp index aec9dff923..4615518831 100644 --- a/indra/newview/llnotificationgrouphandler.cpp +++ b/indra/newview/llnotificationgrouphandler.cpp @@ -62,7 +62,7 @@ void LLGroupHandler::initChannel() } //-------------------------------------------------------------------------- -bool LLGroupHandler::processNotification(const LLNotificationPtr& notification) +bool LLGroupHandler::processNotification(const LLNotificationPtr& notification, bool should_log) { if(mChannel.isDead()) { diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index 7be8c5d0cb..9703bb7626 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -101,10 +101,10 @@ public: // base interface functions virtual void onAdd(LLNotificationPtr p) { processNotification(p); } virtual void onChange(LLNotificationPtr p) { processNotification(p); } - virtual void onLoad(LLNotificationPtr p) { processNotification(p); } + virtual void onLoad(LLNotificationPtr p) { processNotification(p, false); } virtual void onDelete(LLNotificationPtr p) { if (mChannel.get()) mChannel.get()->removeToastByNotificationID(p->getID());} - virtual bool processNotification(const LLNotificationPtr& notify) = 0; + virtual bool processNotification(const LLNotificationPtr& notify, bool should_log = true) = 0; }; class LLSystemNotificationHandler : public LLNotificationHandler @@ -141,7 +141,7 @@ class LLIMHandler : public LLCommunicationNotificationHandler public: LLIMHandler(); virtual ~LLIMHandler(); - bool processNotification(const LLNotificationPtr& p); + bool processNotification(const LLNotificationPtr& p, bool should_log = true); protected: virtual void initChannel(); @@ -157,7 +157,7 @@ public: LLTipHandler(); virtual ~LLTipHandler(); - virtual bool processNotification(const LLNotificationPtr& p); + virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true); protected: virtual void initChannel(); @@ -175,7 +175,7 @@ public: virtual void onDelete(LLNotificationPtr p); virtual void onChange(LLNotificationPtr p); - virtual bool processNotification(const LLNotificationPtr& p); + virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true); virtual void addToastWithNotification(const LLNotificationPtr& p); protected: @@ -193,7 +193,7 @@ public: LLGroupHandler(); virtual ~LLGroupHandler(); - virtual bool processNotification(const LLNotificationPtr& p); + virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true); protected: virtual void initChannel(); @@ -209,7 +209,7 @@ public: virtual ~LLAlertHandler(); virtual void onChange(LLNotificationPtr p); - virtual bool processNotification(const LLNotificationPtr& p); + virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true); protected: virtual void initChannel(); @@ -225,7 +225,7 @@ public: virtual ~LLViewerAlertHandler() {}; virtual void onDelete(LLNotificationPtr p) {}; - virtual bool processNotification(const LLNotificationPtr& p); + virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true); protected: virtual void initChannel() {}; @@ -243,7 +243,7 @@ public: virtual void onChange(LLNotificationPtr p); virtual void onDelete(LLNotificationPtr notification); - virtual bool processNotification(const LLNotificationPtr& p); + virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true); protected: virtual void initChannel(); @@ -261,7 +261,7 @@ public: virtual void onAdd(LLNotificationPtr p); virtual void onLoad(LLNotificationPtr p); virtual void onDelete(LLNotificationPtr p); - virtual bool processNotification(const LLNotificationPtr& p); + virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true); protected: virtual void initChannel() {}; @@ -276,7 +276,7 @@ public: LLBrowserNotification(); virtual ~LLBrowserNotification() {} - virtual bool processNotification(const LLNotificationPtr& p); + virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true); protected: virtual void initChannel() {}; diff --git a/indra/newview/llnotificationhinthandler.cpp b/indra/newview/llnotificationhinthandler.cpp index f1226c53ff..44ebc5ed47 100644 --- a/indra/newview/llnotificationhinthandler.cpp +++ b/indra/newview/llnotificationhinthandler.cpp @@ -53,7 +53,7 @@ void LLHintHandler::onDelete(LLNotificationPtr p) LLHints::getInstance()->hide(p); } -bool LLHintHandler::processNotification(const LLNotificationPtr& p) +bool LLHintHandler::processNotification(const LLNotificationPtr& p, bool should_log) { return false; } diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index faa0cf2e23..16e9ceae63 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -71,7 +71,7 @@ void LLOfferHandler::initChannel() } //-------------------------------------------------------------------------- -bool LLOfferHandler::processNotification(const LLNotificationPtr& notification) +bool LLOfferHandler::processNotification(const LLNotificationPtr& notification, bool should_log) { if(mChannel.isDead()) { diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index 149d50c93a..01d20ac6fb 100644 --- a/indra/newview/llnotificationscripthandler.cpp +++ b/indra/newview/llnotificationscripthandler.cpp @@ -96,7 +96,7 @@ void LLScriptHandler::addToastWithNotification(const LLNotificationPtr& notifica } //-------------------------------------------------------------------------- -bool LLScriptHandler::processNotification(const LLNotificationPtr& notification) +bool LLScriptHandler::processNotification(const LLNotificationPtr& notification, bool should_log) { if(mChannel.isDead()) { @@ -109,7 +109,7 @@ bool LLScriptHandler::processNotification(const LLNotificationPtr& notification) initChannel(); } - if (notification->canLogToIM()) + if (should_log && notification->canLogToIM()) { LLHandlerUtil::logToIMP2P(notification); } diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 4415b60632..469a946d20 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -69,7 +69,7 @@ void LLTipHandler::initChannel() } //-------------------------------------------------------------------------- -bool LLTipHandler::processNotification(const LLNotificationPtr& notification) +bool LLTipHandler::processNotification(const LLNotificationPtr& notification, bool should_log) { if(mChannel.isDead()) { diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index fa5187dce6..d4c68f4aa1 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -61,6 +61,8 @@ static LLPanelInjector t_outfit_gallery("outfit_gallery"); #define MAX_OUTFIT_PHOTO_WIDTH 256 #define MAX_OUTFIT_PHOTO_HEIGHT 256 +const S32 GALLERY_ITEMS_PER_ROW_MIN = 2; + LLOutfitGallery::LLOutfitGallery(const LLOutfitGallery::Params& p) : LLOutfitListBase(), mTexturesObserver(NULL), @@ -95,7 +97,7 @@ LLOutfitGallery::Params::Params() item_width("item_width", 150), item_height("item_height", 175), item_horizontal_gap("item_horizontal_gap", 16), - items_in_row("items_in_row", 3), + items_in_row("items_in_row", GALLERY_ITEMS_PER_ROW_MIN), row_panel_width_factor("row_panel_width_factor", 166), gallery_width_factor("gallery_width_factor", 163) { @@ -153,10 +155,7 @@ void LLOutfitGallery::updateRowsIfNeeded() { reArrangeRows(1); } - // Fix scroll bars if appearance floater at minimum width - //else if((mRowPanelWidth > (getRect().getWidth() + mItemHorizontalGap)) && mItemsInRow > 2) - else if((mRowPanelWidth > (getRect().getWidth() + mItemHorizontalGap)) && mItemsInRow > 2) - // + else if((mRowPanelWidth > (getRect().getWidth() + mItemHorizontalGap)) && mItemsInRow > GALLERY_ITEMS_PER_ROW_MIN) { reArrangeRows(-1); } diff --git a/indra/newview/llpersistentnotificationstorage.cpp b/indra/newview/llpersistentnotificationstorage.cpp index 0020bab035..9d3552c2b0 100644 --- a/indra/newview/llpersistentnotificationstorage.cpp +++ b/indra/newview/llpersistentnotificationstorage.cpp @@ -156,7 +156,7 @@ void LLPersistentNotificationStorage::loadNotifications() // FIRE-11339: Persisted group notifications get logged to IM on each login notification->setIsFromStorage(true); - instance.add(notification); + instance.load(notification); // hide script floaters so they don't confuse the user and don't overlap startup toast LLScriptFloaterManager::getInstance()->setFloaterVisible(notification->getID(), false); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index f7b1a0d3d0..e52f09d4b3 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -72,8 +72,11 @@ LLTrace::EventStatHandle > LLTextureFetch::sCacheH LLTrace::SampleStatHandle LLTextureFetch::sCacheReadLatency("texture_cache_read_latency"); LLTrace::SampleStatHandle LLTextureFetch::sTexDecodeLatency("texture_decode_latency"); +LLTrace::SampleStatHandle LLTextureFetch::sCacheWriteLatency("texture_write_latency"); LLTrace::SampleStatHandle LLTextureFetch::sTexFetchLatency("texture_fetch_latency"); +LLTextureFetchTester* LLTextureFetch::sTesterp = NULL ; +const std::string sTesterName("TextureFetchTester"); ////////////////////////////////////////////////////////////////////////////// // @@ -441,6 +444,29 @@ public: // Threads: Ttf virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response); + enum e_state // mState + { + // *NOTE: Do not change the order/value of state variables, some code + // depends upon specific ordering/adjacency. + + // NOTE: Affects LLTextureBar::draw in lltextureview.cpp (debug hack) + INVALID = 0, + INIT, + 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 + WAIT_HTTP_REQ, // Request sent, wait for completion + DECODE_IMAGE, + DECODE_IMAGE_UPDATE, + WRITE_TO_CACHE, + WAIT_ON_WRITE, + DONE + }; + protected: LLTextureFetchWorker(LLTextureFetch* fetcher, FTType f_type, const std::string& url, const LLUUID& id, const LLHost& host, @@ -520,28 +546,6 @@ private: } private: - enum e_state // mState - { - // *NOTE: Do not change the order/value of state variables, some code - // depends upon specific ordering/adjacency. - - // NOTE: Affects LLTextureBar::draw in lltextureview.cpp (debug hack) - INVALID = 0, - INIT, - 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 - WAIT_HTTP_REQ, // Request sent, wait for completion - DECODE_IMAGE, - DECODE_IMAGE_UPDATE, - WRITE_TO_CACHE, - WAIT_ON_WRITE, - DONE - }; enum e_request_state // mSentRequest { UNSENT = 0, @@ -554,7 +558,7 @@ private: CAN_WRITE = 1, SHOULD_WRITE = 2 }; - static const char* sStateDescs[]; + e_state mState; void setState(e_state new_state); @@ -582,10 +586,15 @@ private: LLFrameTimer mFetchDeltaTimer; LLTimer mCacheReadTimer; LLTimer mDecodeTimer; + LLTimer mCacheWriteTimer; LLTimer mFetchTimer; + LLTimer mStateTimer; F32 mCacheReadTime; // time for cache read only F32 mDecodeTime; // time for decode only + F32 mCacheWriteTime; F32 mFetchTime; // total time from req to finished fetch + std::map mStateTimersMap; + F32 mSkippedStatesTime; LLTextureCache::handle_t mCacheReadHandle, mCacheWriteHandle; S32 mRequestedSize, @@ -869,8 +878,7 @@ bool truncate_viewer_metrics(int max_regions, LLSD & metrics); ////////////////////////////////////////////////////////////////////////////// -//static -const char* LLTextureFetchWorker::sStateDescs[] = { +const char* sStateDescs[] = { "INVALID", "INIT", "LOAD_FROM_TEXTURE_CACHE", @@ -888,6 +896,9 @@ const char* LLTextureFetchWorker::sStateDescs[] = { "DONE" }; +const std::set LOGGED_STATES = { LLTextureFetchWorker::LOAD_FROM_TEXTURE_CACHE, LLTextureFetchWorker::LOAD_FROM_NETWORK, LLTextureFetchWorker::LOAD_FROM_SIMULATOR, + LLTextureFetchWorker::WAIT_HTTP_REQ, LLTextureFetchWorker::DECODE_IMAGE_UPDATE, LLTextureFetchWorker::WAIT_ON_WRITE }; + // static volatile bool LLTextureFetch::svMetricsDataBreak(true); // Start with a data break @@ -919,6 +930,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, mLoadedDiscard(-1), mDecodedDiscard(-1), mCacheReadTime(0.f), + mCacheWriteTime(0.f), mDecodeTime(0.f), mFetchTime(0.f), mCacheReadHandle(LLTextureCache::nullHandle()), @@ -927,6 +939,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, mRequestedOffset(0), mDesiredSize(TEXTURE_CACHE_ENTRY_SIZE), mFileSize(0), + mSkippedStatesTime(0), mCachedSize(0), mLoaded(FALSE), mSentRequest(UNSENT), @@ -1196,6 +1209,13 @@ bool LLTextureFetchWorker::doWork(S32 param) } // Asset Blacklist + mStateTimer.reset(); + mFetchTimer.reset(); + for(auto i : LOGGED_STATES) + { + mStateTimersMap[i] = 0; + } + mSkippedStatesTime = 0; mRawImage = NULL ; mRequestedDiscard = -1; mLoadedDiscard = -1; @@ -1253,9 +1273,10 @@ bool LLTextureFetchWorker::doWork(S32 param) ++mCacheReadCount; std::string filename = mUrl.substr(7, std::string::npos); CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage); + mCacheReadTimer.reset(); mCacheReadHandle = mFetcher->mTextureCache->readFromCache(filename, mID, cache_priority, offset, size, responder); - mCacheReadTimer.reset(); + } else if ((mUrl.empty() || mFTType==FTT_SERVER_BAKE) && mFetcher->canLoadFromCache()) { @@ -1263,9 +1284,9 @@ bool LLTextureFetchWorker::doWork(S32 param) ++mCacheReadCount; CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage); - mCacheReadHandle = mFetcher->mTextureCache->readFromCache(mID, cache_priority, - offset, size, responder); mCacheReadTimer.reset(); + mCacheReadHandle = mFetcher->mTextureCache->readFromCache(mID, cache_priority, + offset, size, responder);; } else if(!mUrl.empty() && mCanUseHTTP) { @@ -1287,6 +1308,7 @@ bool LLTextureFetchWorker::doWork(S32 param) mCacheReadHandle = LLTextureCache::nullHandle(); setState(CACHE_POST); add(LLTextureFetch::sCacheHit, 1.0); + mCacheReadTime = mCacheReadTimer.getElapsedTimeF32(); // fall through } else @@ -1909,7 +1931,7 @@ bool LLTextureFetchWorker::doWork(S32 param) LL_DEBUGS(LOG_TXT) << mID << " DECODE_IMAGE abort: mLoadedDiscard < 0" << LL_ENDL; return true; } - + mDecodeTimer.reset(); mRawImage = NULL; mAuxImage = NULL; llassert_always(mFormattedImage.notNull()); @@ -2003,6 +2025,7 @@ bool LLTextureFetchWorker::doWork(S32 param) // be protected by work mutex and won't be safe to use here nor in cache worker. // So make sure users of getRequestFinished() does not attempt to modify image while // fetcher is working + mCacheWriteTimer.reset(); mCacheWriteHandle = mFetcher->mTextureCache->writeToCache(mID, cache_priority, mFormattedImage->getData(), datasize, mFileSize, mRawImage, mDecodedDiscard, responder); @@ -2013,6 +2036,7 @@ bool LLTextureFetchWorker::doWork(S32 param) { if (writeToCacheComplete()) { + mCacheWriteTime = mCacheWriteTimer.getElapsedTimeF32(); setState(DONE); // fall through } @@ -2521,7 +2545,6 @@ void LLTextureFetchWorker::callbackDecoded(bool success, LLImageRaw* raw, LLImag mDecoded = TRUE; // LL_INFOS(LOG_TXT) << mID << " : DECODE COMPLETE " << LL_ENDL; setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); - mCacheReadTime = mCacheReadTimer.getElapsedTimeF32(); } // -Mw ////////////////////////////////////////////////////////////////////////////// @@ -2649,6 +2672,17 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image } mOriginFetchSource = mFetchSource; } + + // If that test log has ben requested but not yet created, create it + if (LLMetricPerformanceTesterBasic::isMetricLogRequested(sTesterName) && !LLMetricPerformanceTesterBasic::getTester(sTesterName)) + { + sTesterp = new LLTextureFetchTester() ; + if (!sTesterp->isValid()) + { + delete sTesterp; + sTesterp = NULL; + } + } } LLTextureFetch::~LLTextureFetch() @@ -2990,20 +3024,51 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level, } else if (worker->checkWork()) { + F32 decode_time; + F32 fetch_time; + F32 cache_read_time; + F32 cache_write_time; + S32 file_size; + std::map logged_state_timers; + F32 skipped_states_time; worker->lockWorkMutex(); // +Mw last_http_get_status = worker->mGetStatus; discard_level = worker->mDecodedDiscard; raw = worker->mRawImage; aux = worker->mAuxImage; - sample(sTexDecodeLatency, worker->mDecodeTime); - sample(sTexFetchLatency, worker->mFetchTime); - sample(sCacheReadLatency, worker->mCacheReadTime); + + decode_time = worker->mDecodeTime; + fetch_time = worker->mFetchTime; + cache_read_time = worker->mCacheReadTime; + cache_write_time = worker->mCacheWriteTime; + file_size = worker->mFileSize; worker->mCacheReadTimer.reset(); worker->mDecodeTimer.reset(); + worker->mCacheWriteTimer.reset(); worker->mFetchTimer.reset(); + logged_state_timers = worker->mStateTimersMap; + skipped_states_time = worker->mSkippedStatesTime; + worker->mStateTimer.reset(); res = true; LL_DEBUGS(LOG_TXT) << id << ": Request Finished. State: " << worker->mState << " Discard: " << discard_level << LL_ENDL; worker->unlockWorkMutex(); // -Mw + + sample(sTexDecodeLatency, decode_time); + sample(sTexFetchLatency, fetch_time); + sample(sCacheReadLatency, cache_read_time); + sample(sCacheWriteLatency, cache_write_time); + + static LLCachedControl min_time_to_log(gSavedSettings, "TextureFetchMinTimeToLog", 2.f); + if (fetch_time > min_time_to_log) + { + //LL_INFOS() << "fetch_time: " << fetch_time << " cache_read_time: " << cache_read_time << " decode_time: " << decode_time << " cache_write_time: " << cache_write_time << LL_ENDL; + + LLTextureFetchTester* tester = (LLTextureFetchTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) + { + tester->updateStats(logged_state_timers, fetch_time, skipped_states_time, file_size) ; + } + } } else { @@ -3488,6 +3553,21 @@ void LLTextureFetchWorker::setState(e_state new_state) // LL_INFOS(LOG_TXT) << "id: " << mID << " FTType: " << mFTType << " disc: " << mDesiredDiscard << " sz: " << mDesiredSize << " state: " << e_state_name[mState] << " => " << e_state_name[new_state] << LL_ENDL; } + + F32 d_time = mStateTimer.getElapsedTimeF32(); + if (d_time >= 0.0001F) + { + if (LOGGED_STATES.count(mState)) + { + mStateTimersMap[mState] = d_time; + } + else + { + mSkippedStatesTime += d_time; + } + } + + mStateTimer.reset(); mState = new_state; } @@ -3703,7 +3783,7 @@ void LLTextureFetch::dump() LLTextureFetchWorker* worker = (LLTextureFetchWorker*)wreq->getWorkerClass(); LL_INFOS(LOG_TXT) << " ID: " << worker->mID << " PRI: " << llformat("0x%08x",wreq->getPriority()) - << " STATE: " << worker->sStateDescs[worker->mState] + << " STATE: " << sStateDescs[worker->mState] << LL_ENDL; } @@ -5151,4 +5231,40 @@ void LLTextureFetchDebugger::callbackHTTP(FetchEntry & fetch, LLCore::HttpRespon //End LLTextureFetchDebugger /////////////////////////////////////////////////////////////////////////////////////////// +LLTextureFetchTester::LLTextureFetchTester() : LLMetricPerformanceTesterBasic(sTesterName) +{ + mTextureFetchTime = 0; + mSkippedStatesTime = 0; + mFileSize = 0; +} + +LLTextureFetchTester::~LLTextureFetchTester() +{ + outputTestResults(); + LLTextureFetch::sTesterp = NULL; +} + +//virtual +void LLTextureFetchTester::outputTestRecord(LLSD *sd) +{ + std::string currentLabel = getCurrentLabelName(); + + (*sd)[currentLabel]["Texture Fetch Time"] = (LLSD::Real)mTextureFetchTime; + (*sd)[currentLabel]["File Size"] = (LLSD::Integer)mFileSize; + (*sd)[currentLabel]["Skipped States Time"] = (LLSD::String)llformat("%.6f", mSkippedStatesTime); + + for(auto i : LOGGED_STATES) + { + (*sd)[currentLabel][sStateDescs[i]] = mStateTimersMap[i]; + } +} + +void LLTextureFetchTester::updateStats(const std::map state_timers, const F32 fetch_time, const F32 skipped_states_time, const S32 file_size) +{ + mTextureFetchTime = fetch_time; + mStateTimersMap = state_timers; + mFileSize = file_size; + mSkippedStatesTime = skipped_states_time; + outputTestResults(); +} diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 2aa194e141..bf6732963f 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -50,6 +50,7 @@ class LLHost; class LLViewerAssetStats; class LLTextureFetchDebugger; class LLTextureCache; +class LLTextureFetchTester; // Interface class @@ -312,6 +313,7 @@ public: static LLTrace::CountStatHandle sCacheAttempt; static LLTrace::SampleStatHandle sCacheReadLatency; static LLTrace::SampleStatHandle sTexDecodeLatency; + static LLTrace::SampleStatHandle sCacheWriteLatency; static LLTrace::SampleStatHandle sTexFetchLatency; static LLTrace::EventStatHandle > sCacheHitRate; @@ -403,6 +405,9 @@ public: FROM_HTTP_ONLY, INVALID_SOURCE }; + + static LLTextureFetchTester* sTesterp; + private: //debug use LLTextureFetchDebugger* mFetchDebugger; @@ -635,5 +640,26 @@ private: public: static bool isEnabled() {return sDebuggerEnabled;} }; + + +class LLTextureFetchTester : public LLMetricPerformanceTesterBasic +{ +public: + LLTextureFetchTester(); + ~LLTextureFetchTester(); + + void updateStats(const std::map states_timers, const F32 fetch_time, const F32 other_states_time, const S32 file_size); + +protected: + /*virtual*/ void outputTestRecord(LLSD* sd); + +private: + + F32 mTextureFetchTime; + F32 mSkippedStatesTime; + S32 mFileSize; + + std::map mStateTimersMap; +}; #endif // LL_LLTEXTUREFETCH_H diff --git a/indra/newview/llviewerjoystick.h b/indra/newview/llviewerjoystick.h index a6e6413b15..f3129412c7 100644 --- a/indra/newview/llviewerjoystick.h +++ b/indra/newview/llviewerjoystick.h @@ -55,6 +55,7 @@ class LLViewerJoystick : public LLSingleton { LLSINGLETON(LLViewerJoystick); virtual ~LLViewerJoystick(); + LOG_CLASS(LLViewerJoystick); public: void init(bool autoenable); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 997e64a131..89078683e3 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -3258,19 +3258,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CURSOR_CHANGED, new cursor is " << plugin->getCursorName() << LL_ENDL; std::string cursor = plugin->getCursorName(); - - if(cursor == "arrow") - mLastSetCursor = UI_CURSOR_ARROW; - else if(cursor == "ibeam") - mLastSetCursor = UI_CURSOR_IBEAM; - else if(cursor == "splith") - mLastSetCursor = UI_CURSOR_SIZEWE; - else if(cursor == "splitv") - mLastSetCursor = UI_CURSOR_SIZENS; - else if(cursor == "hand") - mLastSetCursor = UI_CURSOR_HAND; - else // for anything else, default to the arrow - mLastSetCursor = UI_CURSOR_ARROW; + mLastSetCursor = getCursorFromString(cursor); } break; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index a39cdf709e..3cda003cb5 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -7700,6 +7700,32 @@ class LLAvatarToggleMyProfile : public view_listener_t } }; +class LLAvatarToggleSearch : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLFloater* instance = LLFloaterReg::findInstance("search"); + if (LLFloater::isMinimized(instance)) + { + instance->setMinimized(FALSE); + instance->setFocus(TRUE); + } + else if (!LLFloater::isShown(instance)) + { + LLFloaterReg::showInstance("search"); + } + else if (!instance->hasFocus() && !instance->getIsChrome()) + { + instance->setFocus(TRUE); + } + else + { + instance->closeFloater(); + } + return true; + } +}; + class LLAvatarResetSkeleton: public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -12025,6 +12051,7 @@ void initialize_menus() view_listener_t::addMenu(new LLAvatarTexRefresh(), "Avatar.TexRefresh"); // ## Zi: Texture Refresh view_listener_t::addMenu(new LLAvatarToggleMyProfile(), "Avatar.ToggleMyProfile"); + view_listener_t::addMenu(new LLAvatarToggleSearch(), "Avatar.ToggleSearch"); view_listener_t::addMenu(new LLAvatarResetSkeleton(), "Avatar.ResetSkeleton"); view_listener_t::addMenu(new LLAvatarEnableResetSkeleton(), "Avatar.EnableResetSkeleton"); view_listener_t::addMenu(new LLAvatarResetSkeletonAndAnimations(), "Avatar.ResetSkeletonAndAnimations"); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 77cece4577..b1d338edb8 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1526,7 +1526,12 @@ void LLViewerRegion::clearCachedVisibleObjects() for(LLVOCacheEntry::vocache_entry_set_t::iterator iter = mImpl->mActiveSet.begin(); iter != mImpl->mActiveSet.end(); ++iter) { - LLDrawable* drawablep = (LLDrawable*)(*iter)->getEntry()->getDrawable(); + LLVOCacheEntry* vo_entry = *iter; + if (!vo_entry || !vo_entry->getEntry()) + { + continue; + } + LLDrawable* drawablep = (LLDrawable*)vo_entry->getEntry()->getDrawable(); if(drawablep && !drawablep->getParent()) { diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 18fba85be1..b4b23995e0 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -211,6 +211,7 @@ LLTrace::EventStatHandle AVATAR_EDIT_TIME("avataredittime", "Second LLTrace::EventStatHandle > OBJECT_CACHE_HIT_RATE("object_cache_hits"); +LLTrace::EventStatHandle TEXTURE_FETCH_TIME("texture_fetch_time"); } LLViewerStats::LLViewerStats() @@ -391,15 +392,6 @@ void update_statistics() add(LLStatViewer::ASSET_UDP_DATA_RECEIVED, F64Bits(gTransferManager.getTransferBitsIn(LLTCT_ASSET))); gTransferManager.resetTransferBitsIn(LLTCT_ASSET); - if (LLAppViewer::getTextureFetch()->getNumRequests() == 0) - { - gTextureTimer.pause(); - } - else - { - gTextureTimer.unpause(); - } - sample(LLStatViewer::VISIBLE_AVATARS, LLVOAvatar::sNumVisibleAvatars); LLWorld::getInstance()->updateNetStats(); LLWorld::getInstance()->requestCacheMisses(); @@ -421,6 +413,19 @@ void update_statistics() } } +void update_texture_time() +{ + if (gTextureList.isPrioRequestsFetched()) + { + gTextureTimer.pause(); + } + else + { + gTextureTimer.unpause(); + } + + record(LLStatViewer::TEXTURE_FETCH_TIME, gTextureTimer.getElapsedTimeF32()); +} /* * The sim-side LLSD is in newsim/llagentinfo.cpp:forwardViewerStats. * diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index b596c744c5..9ee52dba04 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -299,6 +299,7 @@ static const F32 SEND_STATS_PERIOD = 300.0f; // The following are from (older?) statistics code found in appviewer. void update_statistics(); void send_viewer_stats(bool include_preferences); +void update_texture_time(); extern LLFrameTimer gTextureTimer; extern U32Bytes gTotalTextureData; diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index cc9e208957..6022f875aa 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -454,6 +454,7 @@ public: BOOL isFullyLoaded() const; BOOL hasFetcher() const { return mHasFetcher;} + bool isFetching() const { return mIsFetching;} void setCanUseHTTP(bool can_use_http) {mCanUseHTTP = can_use_http;} void forceToDeleteRequest(); diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 16610206d0..9d237018fa 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -206,6 +206,9 @@ static std::string get_texture_list_name() void LLViewerTextureList::doPrefetchImages() { + gTextureTimer.start(); + gTextureTimer.pause(); + if (LLAppViewer::instance()->getPurgeCache()) { // cache was purged, no point @@ -1559,6 +1562,33 @@ S32Megabytes LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, fl return max_texmem; } +bool LLViewerTextureList::isPrioRequestsFetched() +{ + static LLCachedControl prio_threshold(gSavedSettings, "TextureFetchUpdatePriorityThreshold", 0.0f); + static LLCachedControl fetching_textures_threshold(gSavedSettings, "TextureListFetchingThreshold", 0.97f); + S32 fetching_tex_count = 0; + S32 tex_count_threshold = gTextureList.mImageList.size() * (1 - fetching_textures_threshold); + + for (LLViewerTextureList::image_priority_list_t::iterator iter = gTextureList.mImageList.begin(); + iter != gTextureList.mImageList.end(); ) + { + LLPointer imagep = *iter++; + if (imagep->getDecodePriority() > prio_threshold) + { + if (imagep->hasFetcher() || imagep->isFetching()) + { + fetching_tex_count++; + if (fetching_tex_count >= tex_count_threshold) + { + return false; + } + } + } + } + + return true; +} + const S32Megabytes VIDEO_CARD_FRAMEBUFFER_MEM(12); const S32Megabytes MIN_MEM_FOR_NON_TEXTURE(512); void LLViewerTextureList::updateMaxResidentTexMem(S32Megabytes mem) diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index ca26883763..7af3ed7e8b 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -145,6 +145,8 @@ public: // Proper texture memory calculation //static S32Megabytes getMaxVideoRamSetting(bool get_recommended, float mem_multiplier); static S32Megabytes getMaxVideoRamSetting(bool get_recommended, float mem_multiplier, bool clamp_upper_limit = true); + + static bool isPrioRequestsFetched(); private: void updateImagesDecodePriorities(); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index dab506d650..620b56f781 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3300,59 +3300,63 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) if (keyboard_focus && !gFocusMgr.getKeystrokesOnly()) { -#ifdef LL_WINDOWS - // On windows Alt Gr key generates additional Ctrl event, as result handling situations - // like 'AltGr + D' will result in 'Alt+Ctrl+D'. If it results in WM_CHAR, don't let it - // pass into menu or it will trigger 'develop' menu assigned to this combination on top - // of character handling. - // Alt Gr can be additionally modified by Shift - const MASK alt_gr = MASK_CONTROL | MASK_ALT; - LLWindowWin32 *window = static_cast(mWindow); - U32 raw_key = window->getRawWParam(); - if ((mask & alt_gr) != 0 - && ((raw_key >= 0x30 && raw_key <= 0x5A) //0-9, plus normal chartacters - || (raw_key >= 0xBA && raw_key <= 0xE4)) // Misc/OEM characters that can be covered by AltGr, ex: -, =, ~ - && (GetKeyState(VK_RMENU) & 0x8000) != 0 - && (GetKeyState(VK_RCONTROL) & 0x8000) == 0) // ensure right control is not pressed, only left one + LLUICtrl* cur_focus = dynamic_cast(keyboard_focus); + if (cur_focus && cur_focus->acceptsTextInput()) { - // Alt Gr key is represented as right alt and left control. - // Any alt+ctrl combination is treated as Alt Gr by TranslateMessage() and - // will generate a WM_CHAR message, but here we only treat virtual Alt Graph - // key by checking if this specific combination has unicode char. - // - // I decided to handle only virtual RAlt+LCtrl==AltGr combination to minimize - // impact on menu, but the right way might be to handle all Alt+Ctrl calls. - - BYTE keyboard_state[256]; - if (GetKeyboardState(keyboard_state)) +#ifdef LL_WINDOWS + // On windows Alt Gr key generates additional Ctrl event, as result handling situations + // like 'AltGr + D' will result in 'Alt+Ctrl+D'. If it results in WM_CHAR, don't let it + // pass into menu or it will trigger 'develop' menu assigned to this combination on top + // of character handling. + // Alt Gr can be additionally modified by Shift + const MASK alt_gr = MASK_CONTROL | MASK_ALT; + LLWindowWin32 *window = static_cast(mWindow); + U32 raw_key = window->getRawWParam(); + if ((mask & alt_gr) != 0 + && ((raw_key >= 0x30 && raw_key <= 0x5A) //0-9, plus normal chartacters + || (raw_key >= 0xBA && raw_key <= 0xE4)) // Misc/OEM characters that can be covered by AltGr, ex: -, =, ~ + && (GetKeyState(VK_RMENU) & 0x8000) != 0 + && (GetKeyState(VK_RCONTROL) & 0x8000) == 0) // ensure right control is not pressed, only left one { - const int char_count = 6; - wchar_t chars[char_count]; - HKL layout = GetKeyboardLayout(0); - // ToUnicodeEx changes buffer state on OS below Win10, which is undesirable, - // but since we already did a TranslateMessage() in gatherInput(), this - // should have no negative effect - int res = ToUnicodeEx(key, 0, keyboard_state, chars, char_count, 1 << 2 /*do not modify buffer flag*/, layout); - if (res == 1 && chars[0] >= 0x20) + // Alt Gr key is represented as right alt and left control. + // Any alt+ctrl combination is treated as Alt Gr by TranslateMessage() and + // will generate a WM_CHAR message, but here we only treat virtual Alt Graph + // key by checking if this specific combination has unicode char. + // + // I decided to handle only virtual RAlt+LCtrl==AltGr combination to minimize + // impact on menu, but the right way might be to handle all Alt+Ctrl calls. + + BYTE keyboard_state[256]; + if (GetKeyboardState(keyboard_state)) { - // Let it fall through to character handler and get a WM_CHAR. - return TRUE; + const int char_count = 6; + wchar_t chars[char_count]; + HKL layout = GetKeyboardLayout(0); + // ToUnicodeEx changes buffer state on OS below Win10, which is undesirable, + // but since we already did a TranslateMessage() in gatherInput(), this + // should have no negative effect + int res = ToUnicodeEx(key, 0, keyboard_state, chars, char_count, 1 << 2 /*do not modify buffer flag*/, layout); + if (res == 1 && chars[0] >= 0x20) + { + // Let it fall through to character handler and get a WM_CHAR. + return TRUE; + } } } - } #endif - if (!(mask & (MASK_CONTROL | MASK_ALT))) - { - // We have keyboard focus, and it's not an accelerator - if (keyboard_focus && keyboard_focus->wantsKeyUpKeyDown()) + if (!(mask & (MASK_CONTROL | MASK_ALT))) { - return keyboard_focus->handleKey(key, mask, FALSE); - } - else if (key < 0x80) - { - // Not a special key, so likely (we hope) to generate a character. Let it fall through to character handler first. - return TRUE; + // We have keyboard focus, and it's not an accelerator + if (keyboard_focus && keyboard_focus->wantsKeyUpKeyDown()) + { + return keyboard_focus->handleKey(key, mask, FALSE); + } + else if (key < 0x80) + { + // Not a special key, so likely (we hope) to generate a character. Let it fall through to character handler first. + return TRUE; + } } } } diff --git a/indra/newview/res-sdl/lltoolzoomout.BMP b/indra/newview/res-sdl/lltoolzoomout.BMP index 7f958383ab..5bdf96f80d 100644 Binary files a/indra/newview/res-sdl/lltoolzoomout.BMP and b/indra/newview/res-sdl/lltoolzoomout.BMP differ diff --git a/indra/newview/res-sdl/sizeall.BMP b/indra/newview/res-sdl/sizeall.BMP new file mode 100644 index 0000000000..03d9bf4654 Binary files /dev/null and b/indra/newview/res-sdl/sizeall.BMP differ diff --git a/indra/newview/res/lltoolzoomout.cur b/indra/newview/res/lltoolzoomout.cur index b33e68d1a6..21e0ee9702 100644 Binary files a/indra/newview/res/lltoolzoomout.cur and b/indra/newview/res/lltoolzoomout.cur differ diff --git a/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml b/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml index f72791c9fb..6b311c8d62 100644 --- a/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml @@ -36,15 +36,13 @@ stat="FramePixelDifference" bar_max="100" tick_spacing="10" - unit_scale="100" - precision="0"/> + unit_scale="100"/> + tick_spacing="500"/> + show_bar="false"/> + + + + @@ -217,77 +240,61 @@ label="Objects" orientation="horizontal" stat="simobjects" - precision="0" bar_max="30000.f" tick_spacing="5000.f" - show_bar="false" - show_mean="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> @@ -296,81 +303,65 @@ orientation="horizontal" stat="simframemsec" unit_label="ms" - precision="3" bar_max="40.f" tick_spacing="10.f" - show_bar="false" - show_mean="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> + show_bar="false"/> diff --git a/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml index e2cca76d44..5cfa142635 100644 --- a/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml +++ b/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml @@ -317,6 +317,18 @@ +