summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorMnikolenko Productengine <mnikolenko@productengine.com>2021-06-11 19:10:43 +0300
committerMnikolenko Productengine <mnikolenko@productengine.com>2021-06-11 19:10:43 +0300
commit10a770047d90045e882a65e5347da3530b189c42 (patch)
tree59678b29420b818ef79d8ecece0a44185f129cdf /indra/newview
parent0ea94d2948ba8237fd39fa0df219e07ee44c9ff1 (diff)
SL-15297 WIP Implement performance floater
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/llavatarrendernotifier.cpp2
-rw-r--r--indra/newview/llavatarrendernotifier.h3
-rw-r--r--indra/newview/llfloaterperformance.cpp216
-rw-r--r--indra/newview/llfloaterperformance.h65
-rw-r--r--indra/newview/llnamelistctrl.cpp39
-rw-r--r--indra/newview/llnamelistctrl.h23
-rw-r--r--indra/newview/llviewerfloaterreg.cpp2
-rw-r--r--indra/newview/skins/default/colors.xml6
-rw-r--r--indra/newview/skins/default/textures/icons/green_dot.pngbin0 -> 18614 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_performance.xml447
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml7
-rw-r--r--indra/newview/skins/default/xui/en/panel_performance_huds.xml112
-rw-r--r--indra/newview/skins/default/xui/en/panel_performance_nearby.xml161
-rw-r--r--indra/newview/skins/default/xui/en/panel_performance_preferences.xml257
-rw-r--r--indra/newview/skins/default/xui/en/panel_performance_scripts.xml82
-rw-r--r--indra/newview/skins/default/xui/en/panel_performance_troubleshooting.xml190
18 files changed, 1602 insertions, 14 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index fc8d8b805b..1ec1e2cc24 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -286,6 +286,7 @@ set(viewer_SOURCE_FILES
llfloaterpathfindinglinksets.cpp
llfloaterpathfindingobjects.cpp
llfloaterpay.cpp
+ llfloaterperformance.cpp
llfloaterperms.cpp
llfloaterpostprocess.cpp
llfloaterpreference.cpp
@@ -924,6 +925,7 @@ set(viewer_HEADER_FILES
llfloaterpathfindinglinksets.h
llfloaterpathfindingobjects.h
llfloaterpay.h
+ llfloaterperformance.h
llfloaterperms.h
llfloaterpostprocess.h
llfloaterpreference.h
diff --git a/indra/newview/llavatarrendernotifier.cpp b/indra/newview/llavatarrendernotifier.cpp
index 94584a623b..4fd57c7341 100644
--- a/indra/newview/llavatarrendernotifier.cpp
+++ b/indra/newview/llavatarrendernotifier.cpp
@@ -298,6 +298,8 @@ void LLHUDRenderNotifier::updateNotificationHUD(hud_complexity_list_t complexity
return;
}
+ mHUDComplexityList = complexity;
+
// TODO:
// Find a way to show message with list of issues, but without making it too large
// and intrusive.
diff --git a/indra/newview/llavatarrendernotifier.h b/indra/newview/llavatarrendernotifier.h
index ec17b3d9e6..3fd7a32d84 100644
--- a/indra/newview/llavatarrendernotifier.h
+++ b/indra/newview/llavatarrendernotifier.h
@@ -121,6 +121,8 @@ public:
void updateNotificationHUD(hud_complexity_list_t complexity);
bool isNotificationVisible();
+ hud_complexity_list_t getHUDComplexityList() { return mHUDComplexityList; }
+
private:
enum EWarnLevel
{
@@ -141,6 +143,7 @@ private:
EWarnLevel mReportedHUDWarning;
LLHUDComplexity mLatestHUDComplexity;
LLFrameTimer mHUDPopUpDelayTimer;
+ hud_complexity_list_t mHUDComplexityList;
};
#endif /* ! defined(LL_llavatarrendernotifier_H) */
diff --git a/indra/newview/llfloaterperformance.cpp b/indra/newview/llfloaterperformance.cpp
new file mode 100644
index 0000000000..8024d1539c
--- /dev/null
+++ b/indra/newview/llfloaterperformance.cpp
@@ -0,0 +1,216 @@
+/**
+ * @file llfloaterperformance.cpp
+ *
+ * $LicenseInfo:firstyear=2021&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2021, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llfloaterperformance.h"
+
+#include "llappearancemgr.h"
+#include "llavatarrendernotifier.h"
+#include "llfeaturemanager.h"
+#include "llfloaterreg.h"
+#include "llnamelistctrl.h"
+#include "lltextbox.h"
+#include "llvoavatar.h"
+
+
+LLFloaterPerformance::LLFloaterPerformance(const LLSD& key)
+ : LLFloater(key)
+{
+
+}
+
+LLFloaterPerformance::~LLFloaterPerformance()
+{
+}
+
+BOOL LLFloaterPerformance::postBuild()
+{
+ mMainPanel = getChild<LLPanel>("panel_performance_main");
+ mTroubleshootingPanel = getChild<LLPanel>("panel_performance_troubleshooting");
+ mNearbyPanel = getChild<LLPanel>("panel_performance_nearby");
+ mScriptsPanel = getChild<LLPanel>("panel_performance_scripts");
+ mPreferencesPanel = getChild<LLPanel>("panel_performance_preferences");
+ mHUDsPanel = getChild<LLPanel>("panel_performance_huds");
+
+ getChild<LLPanel>("troubleshooting_subpanel")->setMouseDownCallback(boost::bind(&LLFloaterPerformance::showSelectedPanel, this, mTroubleshootingPanel));
+ getChild<LLPanel>("nearby_subpanel")->setMouseDownCallback(boost::bind(&LLFloaterPerformance::showSelectedPanel, this, mNearbyPanel));
+ getChild<LLPanel>("scripts_subpanel")->setMouseDownCallback(boost::bind(&LLFloaterPerformance::showSelectedPanel, this, mScriptsPanel));
+ getChild<LLPanel>("preferences_subpanel")->setMouseDownCallback(boost::bind(&LLFloaterPerformance::showSelectedPanel, this, mPreferencesPanel));
+ getChild<LLPanel>("huds_subpanel")->setMouseDownCallback(boost::bind(&LLFloaterPerformance::showSelectedPanel, this, mHUDsPanel));
+
+ initBackBtn(mTroubleshootingPanel);
+ initBackBtn(mNearbyPanel);
+ initBackBtn(mScriptsPanel);
+ initBackBtn(mPreferencesPanel);
+ initBackBtn(mHUDsPanel);
+
+
+ mHUDsPanel->getChild<LLButton>("refresh_list_btn")->setCommitCallback(boost::bind(&LLFloaterPerformance::populateHUDList, this));
+
+ mHUDList = mHUDsPanel->getChild<LLNameListCtrl>("hud_list");
+ mHUDList->setNameListType(LLNameListCtrl::SPECIAL);
+ mHUDList->setHoverIconName("StopReload_Off");
+ mHUDList->setIconClickedCallback(boost::bind(&LLFloaterPerformance::detachItem, this, _1));
+
+ mPreferencesPanel->getChild<LLButton>("advanced_btn")->setCommitCallback(boost::bind(&LLFloaterPerformance::onClickAdvanced, this));
+ mPreferencesPanel->getChild<LLButton>("defaults_btn")->setCommitCallback(boost::bind(&LLFloaterPerformance::onClickRecommended, this));
+
+ mNearbyPanel->getChild<LLButton>("exceptions_btn")->setCommitCallback(boost::bind(&LLFloaterPerformance::onClickExceptions, this));
+ mNearbyList = mNearbyPanel->getChild<LLNameListCtrl>("nearby_list");
+
+ return TRUE;
+}
+
+void LLFloaterPerformance::showSelectedPanel(LLPanel* selected_panel)
+{
+ selected_panel->setVisible(TRUE);
+ mMainPanel->setVisible(FALSE);
+
+ if (mHUDsPanel == selected_panel)
+ {
+ populateHUDList();
+ }
+ else if (mNearbyPanel == selected_panel)
+ {
+ populateNearbyList();
+ }
+}
+
+void LLFloaterPerformance::showMainPanel()
+{
+ mTroubleshootingPanel->setVisible(FALSE);
+ mNearbyPanel->setVisible(FALSE);
+ mScriptsPanel->setVisible(FALSE);
+ mHUDsPanel->setVisible(FALSE);
+ mPreferencesPanel->setVisible(FALSE);
+ mMainPanel->setVisible(TRUE);
+}
+
+void LLFloaterPerformance::initBackBtn(LLPanel* panel)
+{
+ panel->getChild<LLButton>("back_btn")->setCommitCallback(boost::bind(&LLFloaterPerformance::showMainPanel, this));
+
+ panel->getChild<LLTextBox>("back_lbl")->setShowCursorHand(false);
+ panel->getChild<LLTextBox>("back_lbl")->setSoundFlags(LLView::MOUSE_UP);
+ panel->getChild<LLTextBox>("back_lbl")->setClickedCallback(boost::bind(&LLFloaterPerformance::showMainPanel, this));
+}
+
+void LLFloaterPerformance::populateHUDList()
+{
+ mHUDList->clearRows();
+ mHUDList->updateColumns(true);
+
+ hud_complexity_list_t complexity_list = LLHUDRenderNotifier::getInstance()->getHUDComplexityList();
+
+ hud_complexity_list_t::iterator iter = complexity_list.begin();
+ hud_complexity_list_t::iterator end = complexity_list.end();
+
+ for (; iter != end; ++iter)
+ {
+ LLHUDComplexity hud_object_complexity = *iter;
+
+ LLSD item;
+ item["special_id"] = hud_object_complexity.objectId;
+ item["target"] = LLNameListCtrl::SPECIAL;
+ LLSD& row = item["columns"];
+ row[0]["column"] = "complex_visual";
+ row[0]["type"] = "text";
+ row[0]["value"] = "*";
+
+ row[1]["column"] = "complex_value";
+ row[1]["type"] = "text";
+ row[1]["value"] = std::to_string(hud_object_complexity.objectsCost);
+ row[1]["font"]["name"] = "SANSSERIF";
+
+ row[2]["column"] = "name";
+ row[2]["type"] = "text";
+ row[2]["value"] = hud_object_complexity.objectName;
+ row[2]["font"]["name"] = "SANSSERIF";
+
+ mHUDList->addElement(item);
+ }
+
+ mHUDsPanel->getChild<LLTextBox>("huds_value")->setValue(std::to_string(complexity_list.size()));
+}
+
+void LLFloaterPerformance::populateNearbyList()
+{
+ mNearbyList->clearRows();
+ mNearbyList->updateColumns(true);
+
+ std::vector<LLCharacter*>::iterator char_iter = LLCharacter::sInstances.begin();
+ while (char_iter != LLCharacter::sInstances.end())
+ {
+ LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*char_iter);
+ if (avatar && !avatar->isDead() && !avatar->isControlAvatar())
+ {
+ avatar->calculateUpdateRenderComplexity();
+
+ LLSD item;
+ item["id"] = avatar->getID();
+ LLSD& row = item["columns"];
+ row[0]["column"] = "complex_visual";
+ row[0]["type"] = "text";
+ row[0]["value"] = "*";
+
+ row[1]["column"] = "complex_value";
+ row[1]["type"] = "text";
+ row[1]["value"] = std::to_string( avatar->getVisualComplexity());
+ row[1]["font"]["name"] = "SANSSERIF";
+
+ row[2]["column"] = "name";
+ row[2]["type"] = "text";
+ row[2]["value"] = avatar->getFullname();
+ row[2]["font"]["name"] = "SANSSERIF";
+
+ mNearbyList->addElement(item);
+ }
+ char_iter++;
+ }
+
+}
+
+void LLFloaterPerformance::detachItem(const LLUUID& item_id)
+{
+ LLAppearanceMgr::instance().removeItemFromAvatar(item_id);
+ mHUDList->removeNameItem(item_id);
+}
+
+void LLFloaterPerformance::onClickRecommended()
+{
+ LLFeatureManager::getInstance()->applyRecommendedSettings();
+}
+
+void LLFloaterPerformance::onClickAdvanced()
+{
+ LLFloaterReg::showInstance("prefs_graphics_advanced");
+}
+
+void LLFloaterPerformance::onClickExceptions()
+{
+ LLFloaterReg::showInstance("avatar_render_settings");
+}
+
+// EOF
diff --git a/indra/newview/llfloaterperformance.h b/indra/newview/llfloaterperformance.h
new file mode 100644
index 0000000000..a70a328d3a
--- /dev/null
+++ b/indra/newview/llfloaterperformance.h
@@ -0,0 +1,65 @@
+/**
+ * @file llfloaterperformance.h
+ *
+ * $LicenseInfo:firstyear=2021&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2021, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERPERFORMANCE_H
+#define LL_LLFLOATERPERFORMANCE_H
+
+#include "llfloater.h"
+
+class LLNameListCtrl;
+
+class LLFloaterPerformance : public LLFloater
+{
+public:
+ LLFloaterPerformance(const LLSD& key);
+ virtual ~LLFloaterPerformance();
+
+ /*virtual*/ BOOL postBuild();
+
+ void showSelectedPanel(LLPanel* selected_panel);
+ void showMainPanel();
+
+ void detachItem(const LLUUID& item_id);
+
+private:
+ void initBackBtn(LLPanel* panel);
+ void populateHUDList();
+ void populateNearbyList();
+
+ void onClickAdvanced();
+ void onClickRecommended();
+ void onClickExceptions();
+
+ LLPanel* mMainPanel;
+ LLPanel* mTroubleshootingPanel;
+ LLPanel* mNearbyPanel;
+ LLPanel* mScriptsPanel;
+ LLPanel* mHUDsPanel;
+ LLPanel* mPreferencesPanel;
+ LLNameListCtrl* mHUDList;
+ LLNameListCtrl* mNearbyList;
+};
+
+#endif // LL_LLFLOATERPERFORMANCE_H
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 3209d23e43..e1bf9b1a17 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -67,7 +67,9 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
mNameColumn(p.name_column.column_name),
mAllowCallingCardDrop(p.allow_calling_card_drop),
mShortNames(p.short_names),
- mPendingLookupsRemaining(0)
+ mPendingLookupsRemaining(0),
+ mHoverIconName("Info_Small"),
+ mNameListType(INDIVIDUAL)
{}
// public
@@ -134,7 +136,12 @@ BOOL LLNameListCtrl::handleDragAndDrop(
void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience)
{
- if(is_experience)
+ if (isSpecialType())
+ {
+ mIconClickedSignal(avatar_id);
+ return;
+ }
+ if(is_experience)
{
LLFloaterReg::showInstance("experience_profile", avatar_id, true);
return;
@@ -215,14 +222,16 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
S32 column_index = getColumnIndexFromOffset(x);
LLNameListItem* hit_item = dynamic_cast<LLNameListItem*>(hitItem(x, y));
LLFloater* floater = gFloaterView->getParentFloater(this);
- if (floater
+
+
+ if (floater
&& floater->isFrontmost()
&& hit_item
- && column_index == mNameColumnIndex)
+ && ((column_index == mNameColumnIndex) || isSpecialType()))
{
- // ...this is the column with the avatar name
- LLUUID avatar_id = hit_item->getUUID();
- if (avatar_id.notNull())
+ // ...this is the column with the avatar name
+ LLUUID item_id = isSpecialType() ? hit_item->getSpecialID() : hit_item->getUUID();
+ if (item_id.notNull())
{
// ...valid avatar id
@@ -230,13 +239,13 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
if (hit_cell)
{
S32 row_index = getItemIndex(hit_item);
- LLRect cell_rect = getCellRect(row_index, column_index);
+ LLRect cell_rect = getCellRect(row_index, isSpecialType() ? getNumColumns() - 1 : column_index);
// Convert rect local to screen coordinates
LLRect sticky_rect;
localRectToScreen(cell_rect, &sticky_rect);
// Spawn at right side of cell
- LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small");
+ LLPointer<LLUIImage> icon = LLUI::getUIImage(mHoverIconName);
S32 screenX = sticky_rect.mRight - info_icon_size;
S32 screenY = sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight()) / 2;
LLCoordGL pos(screenX, screenY);
@@ -250,7 +259,7 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
LLToolTip::Params params;
params.background_visible(false);
- params.click_callback(boost::bind(&LLNameListCtrl::showInspector, this, avatar_id, is_group, is_experience));
+ params.click_callback(boost::bind(&LLNameListCtrl::showInspector, this, item_id, is_group, is_experience));
params.delay_time(0.0f); // spawn instantly on hover
params.image(icon);
params.message("");
@@ -321,6 +330,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
// use supplied name by default
std::string fullname = name_item.name;
+
switch(name_item.target)
{
case GROUP:
@@ -339,8 +349,10 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
}
break;
case SPECIAL:
- // just use supplied name
- break;
+ {
+ item->setSpecialID(name_item.special_id());
+ return item;
+ }
case INDIVIDUAL:
{
LLAvatarName av_name;
@@ -420,7 +432,8 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id)
for (item_list::iterator it = getItemList().begin(); it != getItemList().end(); it++)
{
LLScrollListItem* item = *it;
- if (item->getUUID() == agent_id)
+ LLUUID cur_id = isSpecialType() ? dynamic_cast<LLNameListItem*>(item)->getSpecialID() : item->getUUID();
+ if (cur_id == agent_id)
{
idx = getItemIndex(item);
break;
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index ef0be135e6..1a31b1cc10 100644
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -46,6 +46,8 @@ public:
void setIsGroup(bool is_group) { mIsGroup = is_group; }
bool isExperience() const { return mIsExperience; }
void setIsExperience(bool is_experience) { mIsExperience = is_experience; }
+ void setSpecialID(const LLUUID& special_id) { mSpecialID = special_id; }
+ const LLUUID& getSpecialID() const { return mSpecialID; }
protected:
friend class LLNameListCtrl;
@@ -68,6 +70,8 @@ protected:
private:
bool mIsGroup;
bool mIsExperience;
+
+ LLUUID mSpecialID;
};
@@ -95,10 +99,12 @@ public:
{
Optional<std::string> name;
Optional<ENameType, NameTypeNames> target;
+ Optional<LLUUID> special_id;
NameItem()
: name("name"),
- target("target", INDIVIDUAL)
+ target("target", INDIVIDUAL),
+ special_id("special_id", LLUUID())
{}
};
@@ -170,6 +176,12 @@ public:
/*virtual*/ void updateColumns(bool force_update);
/*virtual*/ void mouseOverHighlightNthItem( S32 index );
+
+ bool isSpecialType() { return (mNameListType == SPECIAL); }
+
+ void setNameListType(e_name_type type) { mNameListType = type; }
+ void setHoverIconName(std::string icon_name) { mHoverIconName = icon_name; }
+
private:
void showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience = false);
void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, std::string prefix, LLHandle<LLNameListItem> item);
@@ -186,6 +198,11 @@ private:
S32 mPendingLookupsRemaining;
namelist_complete_signal_t mNameListCompleteSignal;
+
+ std::string mHoverIconName;
+ e_name_type mNameListType;
+
+ boost::signals2::signal<void(const LLUUID &)> mIconClickedSignal;
public:
boost::signals2::connection setOnNameListCompleteCallback(boost::function<void(bool)> onNameListCompleteCallback)
@@ -193,6 +210,10 @@ public:
return mNameListCompleteSignal.connect(onNameListCompleteCallback);
}
+ boost::signals2::connection setIconClickedCallback(boost::function<void(const LLUUID &)> cb)
+ {
+ return mIconClickedSignal.connect(cb);
+ }
};
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 414ae1fad6..eabdb67188 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -102,6 +102,7 @@
#include "llfloaterpathfindingconsole.h"
#include "llfloaterpathfindinglinksets.h"
#include "llfloaterpay.h"
+#include "llfloaterperformance.h"
#include "llfloaterperms.h"
#include "llfloaterpostprocess.h"
#include "llfloaterpreference.h"
@@ -299,6 +300,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("pathfinding_linksets", "floater_pathfinding_linksets.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingLinksets>);
LLFloaterReg::add("pathfinding_console", "floater_pathfinding_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingConsole>);
LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
+ LLFloaterReg::add("performance", "floater_performance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerformance>);
LLFloaterReg::add("perms_default", "floater_perms_default.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPermsDefault>);
LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index efe8102f83..3816bf7e9a 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -963,4 +963,10 @@
<color
name="OutfitGalleryItemUnselected"
value="0.4 0.4 0.4 1" />
+ <color
+ name="PerformanceFloaterGray"
+ value="0.27 0.27 0.27 1" />
+ <color
+ name="PerformanceMid"
+ value="1 0.8 0 1" />
</colors>
diff --git a/indra/newview/skins/default/textures/icons/green_dot.png b/indra/newview/skins/default/textures/icons/green_dot.png
new file mode 100644
index 0000000000..02c07810c2
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/green_dot.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index a875c4e848..51bb91cbf9 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -234,6 +234,8 @@ with the same filename but different name
<texture name="Generic_Person" file_name="icons/Generic_Person.png" preload="false" />
<texture name="Generic_Person_Large" file_name="icons/Generic_Person_Large.png" preload="false" />
+ <texture name="Green_dot" file_name="icons/green_dot.png" preload="false" />
+
<texture name="Hand" file_name="icons/hand.png" preload="false" />
<texture name="Help_Press" file_name="navbar/Help_Press.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/floater_performance.xml b/indra/newview/skins/default/xui/en/floater_performance.xml
new file mode 100644
index 0000000000..42269ba34a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_performance.xml
@@ -0,0 +1,447 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ height="550"
+ layout="topleft"
+ name="performance"
+ save_rect="true"
+ title="IMPROVE GRAPHICS SPEED"
+ width="580">
+ <panel
+ bevel_style="none"
+ follows="left|top"
+ height="490"
+ width="580"
+ name="panel_performance_main"
+ visible="true"
+ layout="topleft"
+ left="0"
+ top="0">
+ <text
+ follows="left|top"
+ font="SansSerifHuge"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="fps_lbl"
+ top="17"
+ width="130">
+ Current FPS
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifHugeBold"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ name="fps_value"
+ width="100">
+ 75.2
+ </text>
+
+ <icon
+ height="16"
+ width="16"
+ image_name="Green_dot"
+ mouse_opaque="true"
+ name="icon_arrow4"
+ follows="right|top"
+ top="16"
+ right="-154"/>
+ <icon
+ height="16"
+ width="16"
+ image_name="Green_dot"
+ mouse_opaque="true"
+ name="icon_arrow4"
+ follows="right|top"
+ top_pad="9"/>
+ <icon
+ height="16"
+ width="16"
+ image_name="Green_dot"
+ mouse_opaque="true"
+ name="icon_arrow4"
+ follows="right|top"
+ top_pad="8"/>
+
+ <text
+ follows="right|top"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ top="17"
+ right="-90"
+ name="client_lbl"
+ width="60">
+ Client:
+ </text>
+ <text
+ follows="right|top"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ top_pad="5"
+ name="client_lbl"
+ width="60">
+ Network:
+ </text>
+ <text
+ follows="right|top"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ top_pad="5"
+ name="client_lbl"
+ width="60">
+ Server:
+ </text>
+ <text
+ follows="right|top"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ right="-15"
+ name="client_value"
+ top="17"
+ width="45">
+ Normal
+ </text>
+ <text
+ follows="right|top"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ name="network_value"
+ top_pad="5"
+ width="45">
+ Normal
+ </text>
+ <text
+ follows="right|top"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ name="server_value"
+ top_pad="5"
+ width="45">
+ Normal
+ </text>
+ <panel
+ bg_alpha_color="PerformanceFloaterGray"
+ background_visible="true"
+ background_opaque="false"
+ border="true"
+ bevel_style="none"
+ follows="left|top"
+ height="60"
+ width="560"
+ name="troubleshooting_subpanel"
+ layout="topleft"
+ left="10"
+ top="102">
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="troubleshooting_lbl"
+ top="12"
+ width="395">
+ General troubleshooting
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerif"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="troubleshooting_info"
+ top_pad="5"
+ width="395">
+ Choose among common problems and see what you can do.
+ </text>
+ <icon
+ height="16"
+ width="16"
+ image_name="Arrow_Right_Off"
+ mouse_opaque="true"
+ name="icon_arrow1"
+ follows="right|top"
+ top="24"
+ right="-20"/>
+ </panel>
+ <panel
+ bg_alpha_color="PerformanceFloaterGray"
+ background_visible="true"
+ background_opaque="false"
+ border="true"
+ bevel_style="none"
+ follows="left|top"
+ height="60"
+ width="560"
+ name="nearby_subpanel"
+ layout="topleft"
+ top_pad="20">
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="avatars_nearby_lbl"
+ top="12"
+ width="115">
+ Avatars nearby:
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="PerformanceMid"
+ height="20"
+ layout="topleft"
+ left_pad="3"
+ name="avatars_nearby_value"
+ width="100">
+ 42 (very high)
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerif"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="avatars_nearby_info"
+ top_pad="5"
+ width="395">
+ Click to review avatars and choose a complexity limit.
+ </text>
+ <icon
+ height="16"
+ width="16"
+ image_name="Arrow_Right_Off"
+ mouse_opaque="true"
+ name="icon_arrow2"
+ follows="right|top"
+ top="24"
+ right="-20"/>
+ </panel>
+ <panel
+ bg_alpha_color="PerformanceFloaterGray"
+ background_visible="true"
+ background_opaque="false"
+ border="true"
+ bevel_style="none"
+ follows="left|top"
+ height="60"
+ width="560"
+ name="preferences_subpanel"
+ layout="topleft"
+ top_pad="20">
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="complexity_lbl"
+ top="12"
+ width="110">
+ This location is
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="PerformanceMid"
+ height="20"
+ layout="topleft"
+ left_pad="3"
+ name="complexity_value"
+ width="100">
+ very complex
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerif"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="complexity_info"
+ top_pad="5"
+ width="395">
+ Try changing graphics quality or draw distance.
+ </text>
+ <icon
+ height="16"
+ width="16"
+ image_name="Arrow_Right_Off"
+ mouse_opaque="true"
+ name="icon_arrow3"
+ follows="right|top"
+ top="24"
+ right="-20"/>
+ </panel>
+ <panel
+ bg_alpha_color="PerformanceFloaterGray"
+ background_visible="true"
+ background_opaque="false"
+ border="true"
+ bevel_style="none"
+ follows="left|top"
+ height="60"
+ width="560"
+ name="scripts_subpanel"
+ layout="topleft"
+ top_pad="20">
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="scripts_lbl"
+ top="12"
+ width="88">
+ Your avatar:
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="PerformanceMid"
+ height="20"
+ layout="topleft"
+ left_pad="2"
+ name="scripts_value"
+ width="100">
+ 12 scripts
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerif"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="scripts_info"
+ top_pad="5"
+ width="395">
+ Removing high-impact attachments may improve graphics speed.
+ </text>
+ <icon
+ height="16"
+ width="16"
+ image_name="Arrow_Right_Off"
+ mouse_opaque="true"
+ name="icon_arrow4"
+ follows="right|top"
+ top="24"
+ right="-20"/>
+ </panel>
+ <panel
+ bg_alpha_color="PerformanceFloaterGray"
+ background_visible="true"
+ background_opaque="false"
+ border="true"
+ bevel_style="none"
+ follows="left|top"
+ height="60"
+ width="560"
+ name="huds_subpanel"
+ layout="topleft"
+ top_pad="20">
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="huds_lbl"
+ top="12"
+ width="80">
+ Your HUDs:
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="PerformanceMid"
+ height="20"
+ layout="topleft"
+ left_pad="3"
+ name="huds_value"
+ width="100">
+ 7
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerif"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="huds_info"
+ top_pad="5"
+ width="395">
+ Removing HUDs you are not using can improve graphics speed.
+ </text>
+ <icon
+ height="16"
+ width="16"
+ image_name="Arrow_Right_Off"
+ mouse_opaque="true"
+ name="icon_arrow4"
+ follows="right|top"
+ top="24"
+ right="-20"/>
+ </panel>
+ </panel>
+ <panel
+ filename="panel_performance_troubleshooting.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="panel_performance_troubleshooting"
+ visible="false"
+ top="0" />
+ <panel
+ filename="panel_performance_nearby.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="panel_performance_nearby"
+ visible="false"
+ top="0" />
+ <panel
+ filename="panel_performance_scripts.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="panel_performance_scripts"
+ visible="false"
+ top="0" />
+ <panel
+ filename="panel_performance_preferences.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="panel_performance_preferences"
+ visible="false"
+ top="0" />
+ <panel
+ filename="panel_performance_huds.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="panel_performance_huds"
+ visible="false"
+ top="0" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 0a50ff089f..f275b309a1 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -239,6 +239,13 @@
function="Floater.Toggle"
parameter="preferences" />
</menu_item_call>
+ <menu_item_call
+ label="Performance..."
+ name="Performance">
+ <menu_item_call.on_click
+ function="Floater.Toggle"
+ parameter="performance" />
+ </menu_item_call>
<menu_item_call
label="Toolbar buttons..."
name="Toolbars">
diff --git a/indra/newview/skins/default/xui/en/panel_performance_huds.xml b/indra/newview/skins/default/xui/en/panel_performance_huds.xml
new file mode 100644
index 0000000000..c881fadbe8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_performance_huds.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ bevel_style="none"
+ follows="left|top"
+ height="490"
+ width="580"
+ name="panel_performance_huds"
+ layout="topleft"
+ left="0"
+ top="0">
+ <button
+ height="16"
+ width="16"
+ layout="topleft"
+ mouse_opaque="true"
+ follows="left|top"
+ name="back_btn"
+ top="10"
+ image_selected="Arrow_Left_Off"
+ image_pressed="Arrow_Left_Off"
+ image_unselected="Arrow_Left_Off"
+ left="15"
+ is_toggle="true">
+ </button>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="3"
+ top="13"
+ name="back_lbl"
+ width="40">
+ Back
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="PerformanceMid"
+ height="20"
+ layout="topleft"
+ left="20"
+ top_pad="10"
+ name="huds_title"
+ width="120">
+ HUDs displayed:
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLargeBold"
+ text_color="PerformanceMid"
+ height="20"
+ layout="topleft"
+ left_pad="3"
+ name="huds_value"
+ width="70">
+ 7
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="5"
+ left="20"
+ name="huds_desc1"
+ width="540">
+ If there are any you don't need, detaching them may improve graphics speed.
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="3"
+ left="20"
+ name="huds_desc2"
+ width="540">
+ Note: Using a HUD's minimize button does not save memory.
+ </text>
+ <name_list
+ column_padding="0"
+ draw_stripes="true"
+ height="220"
+ follows="left|top"
+ layout="topleft"
+ name="hud_list"
+ top_pad="10"
+ width="540">
+ <name_list.columns
+ label=""
+ name="complex_visual"
+ width="90" />
+ <name_list.columns
+ label=""
+ name="complex_value"
+ width="40" />
+ <name_list.columns
+ label=""
+ name="name"/>
+ </name_list>
+ <button
+ follows="left|top"
+ height="19"
+ label="Refresh List"
+ layout="topleft"
+ name="refresh_list_btn"
+ top_pad="20"
+ width="100" />
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_performance_nearby.xml b/indra/newview/skins/default/xui/en/panel_performance_nearby.xml
new file mode 100644
index 0000000000..ade5f99451
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_performance_nearby.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ bevel_style="none"
+ follows="left|top"
+ height="490"
+ width="580"
+ name="panel_performance_nearby"
+ layout="topleft"
+ left="0"
+ top="0">
+ <button
+ height="16"
+ width="16"
+ layout="topleft"
+ mouse_opaque="true"
+ follows="left|top"
+ name="back_btn"
+ top="10"
+ image_selected="Arrow_Left_Off"
+ image_pressed="Arrow_Left_Off"
+ image_unselected="Arrow_Left_Off"
+ left="15"
+ is_toggle="true">
+ </button>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="3"
+ top="13"
+ name="back_lbl"
+ width="40">
+ Back
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="PerformanceMid"
+ height="20"
+ layout="topleft"
+ left="20"
+ top_pad="10"
+ name="av_nearby_title"
+ width="215">
+ Avatars within draw distance:
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLargeBold"
+ text_color="PerformanceMid"
+ height="20"
+ layout="topleft"
+ left_pad="3"
+ name="av_nearby_value"
+ width="150">
+ 42 (very high)
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ left="20"
+ top_pad="5"
+ name="av_nearby_desc"
+ width="580">
+ Some avatars nearby are slow to display. Choosing complexity limit may help graphics speed.
+ </text>
+ <slider
+ control_name="IndirectMaxComplexity"
+ tool_tip="Controls at what point a visually complex avatar is drawn as a JellyDoll"
+ follows="left|top"
+ height="16"
+ initial_value="101"
+ increment="1"
+ label="Avatar Maximum Complexity:"
+ label_width="165"
+ layout="topleft"
+ min_val="1"
+ max_val="101"
+ name="IndirectMaxComplexity"
+ show_text="false"
+ top_pad="10"
+ width="300">
+ <slider.commit_callback
+ function="Pref.UpdateIndirectMaxComplexity"
+ parameter="IndirectMaxComlexityText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ top_delta="0"
+ left_delta="304"
+ text_readonly_color="LabelDisabledColor"
+ name="IndirectMaxComplexityText"
+ width="65">
+ 0
+ </text>
+ <name_list
+ column_padding="0"
+ draw_stripes="true"
+ height="220"
+ left="20"
+ follows="left|top"
+ layout="topleft"
+ sort_column="complex_value"
+ name="nearby_list"
+ name_column="name"
+ top_pad="10"
+ width="540">
+ <name_list.columns
+ label=""
+ name="complex_visual"
+ width="90" />
+ <name_list.columns
+ label=""
+ name="complex_value"
+ width="40" />
+ <name_list.columns
+ label=""
+ name="name"/>
+ </name_list>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ left="20"
+ top_pad="10"
+ name="av_nearby_desc2"
+ width="580">
+ You can also right-click on an avatar to control display.
+ </text>
+ <button
+ height="23"
+ label="Exceptions..."
+ layout="topleft"
+ left="460"
+ top_delta="2"
+ name="exceptions_btn"
+ width="100">
+ </button>
+ <check_box
+ control_name="AlwaysRenderFriends"
+ height="16"
+ initial_value="true"
+ label="Always display friends"
+ layout="topleft"
+ name="display_friends"
+ top_pad="3"
+ left="18"
+ width="256">
+ </check_box>
+
+
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml
new file mode 100644
index 0000000000..81605b35a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ bevel_style="none"
+ follows="left|top"
+ height="490"
+ width="580"
+ name="panel_performance_preferences"
+ layout="topleft"
+ left="0"
+ top="0">
+ <button
+ height="16"
+ width="16"
+ layout="topleft"
+ mouse_opaque="true"
+ follows="left|top"
+ name="back_btn"
+ top="10"
+ image_selected="Arrow_Left_Off"
+ image_pressed="Arrow_Left_Off"
+ image_unselected="Arrow_Left_Off"
+ left="15"
+ is_toggle="true">
+ </button>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="3"
+ top="13"
+ name="back_lbl"
+ width="40">
+ Back
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="PerformanceMid"
+ height="20"
+ layout="topleft"
+ left="20"
+ top_pad="10"
+ name="preferences_title"
+ width="300">
+ This location is very complex
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="5"
+ name="preferences_desc"
+ width="580">
+ While you are here, you may want to reduce graphics quality or draw distance.
+ </text>
+
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="35"
+ name="quality_lbl"
+ width="100">
+ Graphics quality
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ left_pad="40"
+ name="fastest_lbl"
+ width="40">
+ Fastest
+ </text>
+ <slider
+ control_name="RenderQualityPerformance"
+ decimal_digits="0"
+ follows="left|top"
+ height="16"
+ increment="1"
+ initial_value="0"
+ layout="topleft"
+ left_pad="5"
+ max_val="6"
+ name="graphics_quality"
+ show_text="false"
+ top_delta="-1"
+ width="275">
+ </slider>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ left_pad="10"
+ top_delta="1"
+ name="quality_lbl"
+ width="70">
+ Best quality
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="40"
+ left="20"
+ name="enhancements_lbl"
+ width="100">
+ Enhancements
+ </text>
+ <check_box
+ control_name="WindLightUseAtmosShaders"
+ height="16"
+ initial_value="true"
+ label="Atmospheric shaders"
+ layout="topleft"
+ name="atmospheric_shaders"
+ left_pad="37"
+ width="280">
+ </check_box>
+ <check_box
+ control_name="RenderDeferred"
+ height="16"
+ initial_value="true"
+ label="Advanced Lighting Model"
+ layout="topleft"
+ name="advanced_lighting_model"
+ top_delta="24"
+ width="256">
+ </check_box>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="40"
+ left="20"
+ name="distance_lbl"
+ width="100">
+ Draw distance
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ left_pad="40"
+ name="faster_lbl"
+ width="40">
+ Faster
+ </text>
+ <slider
+ control_name="RenderFarClip"
+ decimal_digits="0"
+ follows="left|top"
+ top_delta="-1"
+ height="16"
+ increment="8"
+ initial_value="160"
+ label_width="90"
+ layout="topleft"
+ min_val="64"
+ max_val="512"
+ name="draw_distance"
+ left_pad="5"
+ width="250" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left_pad="1"
+ top_delta="0"
+ name="draw_distance_m"
+ width="20">
+ m
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ left_pad="10"
+ top_delta="1"
+ name="farther_lbl"
+ width="40">
+ Farther
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="20"
+ left="160"
+ name="distance_desc1"
+ width="100">
+ Regions are 256 m x 256 m.
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="5"
+ left="160"
+ name="distance_desc2"
+ width="400">
+ To zoom out and see long distances, increase the draw distance.
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="5"
+ left="160"
+ name="distance_desc3"
+ width="400">
+ If you are socializing in a small area, decrease the draw distance.
+ </text>
+ <button
+ follows="top|left"
+ height="23"
+ label="Reset to recommended settings"
+ layout="topleft"
+ left="20"
+ name="defaults_btn"
+ top_delta="50"
+ width="210">
+ </button>
+ <button
+ follows="top|left"
+ height="23"
+ label="Advanced Settings..."
+ layout="topleft"
+ left_pad="10"
+ name="advanced_btn"
+ top_delta="0"
+ width="200"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_performance_scripts.xml b/indra/newview/skins/default/xui/en/panel_performance_scripts.xml
new file mode 100644
index 0000000000..e6dc4a217d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_performance_scripts.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ bevel_style="none"
+ follows="left|top"
+ height="490"
+ width="580"
+ name="panel_performance_scripts"
+ layout="topleft"
+ left="0"
+ top="0">
+ <button
+ height="16"
+ width="16"
+ layout="topleft"
+ mouse_opaque="true"
+ follows="left|top"
+ name="back_btn"
+ top="10"
+ image_selected="Arrow_Left_Off"
+ image_pressed="Arrow_Left_Off"
+ image_unselected="Arrow_Left_Off"
+ left="15"
+ is_toggle="true">
+ </button>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="3"
+ top="13"
+ name="back_lbl"
+ width="40">
+ Back
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="PerformanceMid"
+ height="20"
+ layout="topleft"
+ left="20"
+ top_pad="10"
+ name="attachments_title"
+ width="195">
+ Avatar attachment scripts:
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLargeBold"
+ text_color="PerformanceMid"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ name="attachments_value"
+ width="70">
+ 12
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="5"
+ left="20"
+ name="attachments_desc1"
+ width="580">
+ These attachments contain scripts (embedded apps) that use memory.
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="3"
+ left="20"
+ name="attachments_desc2"
+ width="580">
+ If there are any you don't need, detaching them may improve graphics speed.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_performance_troubleshooting.xml b/indra/newview/skins/default/xui/en/panel_performance_troubleshooting.xml
new file mode 100644
index 0000000000..d942580880
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_performance_troubleshooting.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ bevel_style="none"
+ follows="left|top"
+ height="490"
+ width="580"
+ name="panel_performance_troubleshooting"
+ layout="topleft"
+ left="0"
+ top="0">
+ <button
+ height="16"
+ width="16"
+ layout="topleft"
+ mouse_opaque="true"
+ follows="left|top"
+ name="back_btn"
+ top="10"
+ image_selected="Arrow_Left_Off"
+ image_pressed="Arrow_Left_Off"
+ image_unselected="Arrow_Left_Off"
+ left="15"
+ is_toggle="true">
+ </button>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="3"
+ top="13"
+ name="back_lbl"
+ width="40">
+ Back
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="PerformanceMid"
+ height="20"
+ layout="topleft"
+ left="20"
+ top_pad="10"
+ name="troubleshooting_title"
+ width="300">
+ Fixes for common problems
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="5"
+ name="troubleshooting_desc"
+ width="580">
+ Some problems result from the complexity of the location where you are. All you can do is leave.
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ top_pad="30"
+ name="rubberbanding_title"
+ width="580">
+ Rubberbanding
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="5"
+ name="rubberbanding_desc"
+ width="580">
+ When you walk, your avatar may be pulled backward again and again.
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="3"
+ name="rubberbanding_fix"
+ width="580">
+ Fix: XXXXXXX
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ top_pad="25"
+ name="tex_thrashing_title"
+ width="580">
+ Texture thrashing
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="5"
+ name="tex_thrashing_desc"
+ width="580">
+ On objects near you, you may see their surfaces get blurry, then sharp, then blurry again.
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="3"
+ name="tex_thrashing_fix"
+ width="580">
+ Fix: XXXXXXX
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ top_pad="25"
+ name="av_moving_title"
+ width="580">
+ Avatars are not moving smoothly
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="5"
+ name="av_moving_desc"
+ width="580">
+ Lorem ipsum dolor sit amet.
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="3"
+ name="av_moving_fix"
+ width="580">
+ Fix: XXXXXXX
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="White"
+ height="20"
+ layout="topleft"
+ top_pad="25"
+ name="av_moving_title"
+ width="580">
+ Will a better graphics card or new computer help?
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="5"
+ name="av_moving_desc"
+ width="580">
+ Lorem ipsum dolor sit amet.
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ text_color="White"
+ height="18"
+ layout="topleft"
+ top_pad="3"
+ name="av_moving_fix"
+ width="580">
+ Fix: XXXXXXX
+ </text>
+</panel>