diff --git a/indra/newview/fsfloaterperformance.cpp b/indra/newview/fsfloaterperformance.cpp index eaaf5b32df..9bf3b050d6 100644 --- a/indra/newview/fsfloaterperformance.cpp +++ b/indra/newview/fsfloaterperformance.cpp @@ -306,20 +306,11 @@ void FSFloaterPerformance::draw() pct_swap_time = llclamp(pct_swap_time,0.,100.); pct_scene_render_time = llclamp(pct_scene_render_time,0.,100.); - args["AV_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_avatar_time)); - args["HUDS_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_huds_time)); - args["UI_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_ui_time)); - args["IDLE_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_idle_time)); - args["SWAP_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_swap_time)); - args["SCENERY_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_scene_render_time)); +// update the top line status - also check whether we're sleeping/limiting + args["TOT_FRAME_TIME"] = llformat("%02u", (U32)llround(tot_frame_time_ns/1000000)); args["FPSCAP"] = llformat("%02u", (U32)fpsCap); args["FPSTARGET"] = llformat("%02u", (U32)targetFPS); - - getChild("av_frame_stats")->setText(getString("av_frame_pct", args)); - getChild("huds_frame_stats")->setText(getString("huds_frame_pct", args)); - getChild("frame_breakdown")->setText(getString("frame_stats", args)); - auto textbox = getChild("fps_warning"); if (tot_sleep_time_raw > 0) // We are sleeping because view is not focussed { @@ -345,7 +336,30 @@ void FSFloaterPerformance::draw() { textbox->setVisible(false); } +// pre-fill the args + if(!unreliable) + { + args["AV_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_avatar_time)); + args["HUDS_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_huds_time)); + args["UI_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_ui_time)); + args["IDLE_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_idle_time)); + args["SWAP_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_swap_time)); + args["SCENERY_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_scene_render_time)); + } + else + { + args["AV_FRAME_PCT"] = "--"; + args["HUDS_FRAME_PCT"] = "--"; + args["UI_FRAME_PCT"] = "--"; + args["IDLE_FRAME_PCT"] = "--"; + args["SWAP_FRAME_PCT"] = "--"; + args["SCENERY_FRAME_PCT"] = "--"; + } + getChild("av_frame_stats")->setText(getString("av_frame_pct", args)); + getChild("huds_frame_stats")->setText(getString("huds_frame_pct", args)); + getChild("frame_breakdown")->setText(getString("frame_stats", args)); + auto button = getChild("AutoTuneFPS"); if((bool)button->getToggleState() != FSPerfStats::tunables.userAutoTuneEnabled) { diff --git a/indra/newview/fsperfstats.cpp b/indra/newview/fsperfstats.cpp index 1aade3788f..1ee6e94c09 100644 --- a/indra/newview/fsperfstats.cpp +++ b/indra/newview/fsperfstats.cpp @@ -186,39 +186,39 @@ namespace FSPerfStats sceneStats[static_cast(statEntry)] = avg + (val / SMOOTHING_PERIODS) - (avg / SMOOTHING_PERIODS); // LL_INFOS("scenestats") << "Scenestat: " << static_cast(statEntry) << " before=" << avg << " new=" << val << " newavg=" << statsDoubleBuffer[writeBuffer][static_cast(ObjType_t::OT_GENERAL)][LLUUID::null][static_cast(statEntry)] << LL_ENDL; } - - auto& statsMap = statsDoubleBuffer[writeBuffer][static_cast(ObjType_t::OT_ATTACHMENT)]; - for(auto& stat_entry : statsMap) - { - auto val = stat_entry.second[static_cast(ST::RENDER_COMBINED)]; - if(val > SMOOTHING_PERIODS){ - auto avg = statsDoubleBuffer[writeBuffer ^ 1][static_cast(ObjType_t::OT_ATTACHMENT)][stat_entry.first][static_cast(ST::RENDER_COMBINED)]; - stat_entry.second[static_cast(ST::RENDER_COMBINED)] = avg + (val / SMOOTHING_PERIODS) - (avg / SMOOTHING_PERIODS); - } - } - - - auto& statsMapAv = statsDoubleBuffer[writeBuffer][static_cast(ObjType_t::OT_AVATAR)]; - for(auto& stat_entry : statsMapAv) - { - for(auto& stat : avatarStatsToAvg) - { - auto val = stat_entry.second[static_cast(stat)]; - if(val > SMOOTHING_PERIODS) - { - auto avg = statsDoubleBuffer[writeBuffer ^ 1][static_cast(ObjType_t::OT_AVATAR)][stat_entry.first][static_cast(stat)]; - stat_entry.second[static_cast(stat)] = avg + (val / SMOOTHING_PERIODS) - (avg / SMOOTHING_PERIODS); - } - } - } - - // swap the buffers - if(enabled()) - { - std::lock_guard lock{bufferToggleLock}; - writeBuffer ^= 1; - }; // note we are relying on atomic updates here. The risk is low and would cause minor errors in the stats display. } +// Allow attachment times etc to update even when FPS limited or sleeping. + auto& statsMap = statsDoubleBuffer[writeBuffer][static_cast(ObjType_t::OT_ATTACHMENT)]; + for(auto& stat_entry : statsMap) + { + auto val = stat_entry.second[static_cast(ST::RENDER_COMBINED)]; + if(val > SMOOTHING_PERIODS){ + auto avg = statsDoubleBuffer[writeBuffer ^ 1][static_cast(ObjType_t::OT_ATTACHMENT)][stat_entry.first][static_cast(ST::RENDER_COMBINED)]; + stat_entry.second[static_cast(ST::RENDER_COMBINED)] = avg + (val / SMOOTHING_PERIODS) - (avg / SMOOTHING_PERIODS); + } + } + + + auto& statsMapAv = statsDoubleBuffer[writeBuffer][static_cast(ObjType_t::OT_AVATAR)]; + for(auto& stat_entry : statsMapAv) + { + for(auto& stat : avatarStatsToAvg) + { + auto val = stat_entry.second[static_cast(stat)]; + if(val > SMOOTHING_PERIODS) + { + auto avg = statsDoubleBuffer[writeBuffer ^ 1][static_cast(ObjType_t::OT_AVATAR)][stat_entry.first][static_cast(stat)]; + stat_entry.second[static_cast(stat)] = avg + (val / SMOOTHING_PERIODS) - (avg / SMOOTHING_PERIODS); + } + } + } + + // swap the buffers + if(enabled()) + { + std::lock_guard lock{bufferToggleLock}; + writeBuffer ^= 1; + }; // note we are relying on atomic updates here. The risk is low and would cause minor errors in the stats display. // clean the write maps in all cases. auto& statsTypeMatrix = statsDoubleBuffer[writeBuffer]; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index a46b8e7783..de6dae5fda 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -2925,10 +2925,46 @@ void LLInventoryModel::buildParentChildMap() { // Fatal inventory error. Will not be able to engage in many inventory operations. // This should be followed by an error dialog leading to logout. + // FIRE-31634 [OPENSIM] Inventory Validation fails on old and grandfathered inventories + // We will report the errors but allow the user to continue. + #ifdef OPENSIM + if (LLGridManager::getInstance()->isInOpenSim()) + { + LLSD args; + LLSD grid_info; + LLGridManager::getInstance()->getGridData(grid_info); + if (grid_info.has("help")) + { + args["HELP"] = grid_info["help"].asString(); + } + else + { + args["HELP"] = LLTrans::getString("OpenSimInventoryValidationErrorGenericHelp"); + } + args["ERRORS"] = validation_info->mLog.str(); + LL_WARNS("Inventory") << "Potentially fatal errors were found during validation:" + << "You may not be able to do normal inventory operations in this session." + << "Contact your Grid Operator's support team and provide them with your logs." + << LL_ENDL; + LL_WARNS("Inventory") << "### Start of errors ###" << LL_ENDL; + LL_WARNS("Inventory") << validation_info->mLog.str() << LL_ENDL; + LL_WARNS("Inventory") << "### End of errors ###" << LL_ENDL; + LLNotificationsUtil::add("InventoryValidationFailed", args); + mIsAgentInvUsable = true; + } + else + { + #endif // OPENSIM + // LL_WARNS("Inventory") << "Fatal errors were found in validate(): unable to initialize inventory! " << "Will not be able to do normal inventory operations in this session." << LL_ENDL; mIsAgentInvUsable = false; + // FIRE-31634 [OPENSIM] Inventory Validation fails on old and grandfathered inventories + #ifdef OPENSIM + } + #endif + // } else { @@ -4365,7 +4401,13 @@ LLPointer LLInventoryModel::validate() const if (getLibraryRootFolderID().isNull()) { // Probably shouldn't be a fatality, inventory can function without a library - LL_WARNS("Inventory") << "Fatal inventory corruption: no library root folder id" << LL_ENDL; + // FIRE-31634 [OPENSIM] Better inventory validation logging + // LL_WARNS("Inventory") << "Fatal inventory corruption: no library root folder id" << LL_ENDL; + std::ostringstream out; + out << "No library root folder id"; + LL_WARNS("Inventory") << "Fatal inventory corruption: " << out.str() << LL_ENDL; + validation_info->mLog << out.str() << std::endl; + // validation_info->mFatalNoLibraryRootFolder = true; fatal_errs++; } @@ -4738,11 +4780,19 @@ LLPointer LLInventoryModel::validate() const { if (count_under_root==0) { - LL_WARNS("Inventory") << "Expected system folder type " << ft << " was not found under root" << LL_ENDL; + LL_WARNS("Inventory") << "Expected system folder type " << LLFolderType::lookup(folder_type) << "(" << ft << ") was not found under root" << LL_ENDL; // // FIRE-31634 [OPENSIM] better logging for inventory issues // Need to create, if allowed. if (is_automatic) { - LL_WARNS("Inventory") << "Fatal inventory corruption: cannot create system folder of type " << ft << LL_ENDL; + + // FIRE-31634 [OPENSIM] Better inventory validation logging + // LL_WARNS("Inventory") << "Fatal inventory corruption: cannot create system folder of type " << LLFolderType::lookup(folder_type) << "(" << ft << ")" << LL_ENDL; + std::ostringstream out; + out << "Cannot create system folder of type " << LLFolderType::lookup(folder_type) << "(" << ft << ")"; + LL_WARNS("Inventory") << "Fatal inventory corruption: " << out.str() << LL_ENDL; + validation_info->mLog << out.str() << std::endl; + // + fatal_errs++; validation_info->mMissingRequiredSystemFolders.insert(folder_type); } @@ -4754,16 +4804,25 @@ LLPointer LLInventoryModel::validate() const } else if (count_under_root > 1) { - LL_WARNS("Inventory") << "Fatal inventory corruption: system folder type has excess copies under root, type " << ft << " count " << count_under_root << LL_ENDL; + // LL_WARNS("Inventory") << "Fatal inventory corruption: system folder type has excess copies under root, type " << ft << " count " << count_under_root << LL_ENDL; // FIRE-31634 [OPENSIM] Better inventory validation logging validation_info->mDuplicateRequiredSystemFolders.insert(folder_type); if (!is_automatic && folder_type != LLFolderType::FT_SETTINGS) { + // FIRE-31634 [OPENSIM] Better inventory validation logging + // LL_WARNS("Inventory") << "Fatal inventory corruption: system folder type has excess copies under root, type " << LLFolderType::lookup(folder_type) << "(" << ft << ") count " << count_under_root << LL_ENDL; + std::ostringstream out; + out << "System folder type has excess copies under root, type " << LLFolderType::lookup(folder_type) << "(" << ft << ") count " << count_under_root; + LL_WARNS("Inventory") << "Fatal inventory corruption: " << out.str() << LL_ENDL; + validation_info->mLog << out.str() << std::endl; + // + // It is a fatal problem or can lead to fatal problems for COF, // outfits, trash and other non-automatic folders. fatal_errs++; } else { + LL_WARNS("Inventory") << "Non-Fatal inventory corruption: system folder type has excess copies under root, type " << LLFolderType::lookup(folder_type) << "(" << ft << ") count " << count_under_root << LL_ENDL; // FIRE-31634 [OPENSIM] Better inventory validation logging // For automatic folders it's not a fatal issue and shouldn't // break inventory or other functionality further // Exception: FT_SETTINGS is not automatic, but only deserves a warning. @@ -4772,7 +4831,7 @@ LLPointer LLInventoryModel::validate() const } if (count_elsewhere > 0) { - LL_WARNS("Inventory") << "Found " << count_elsewhere << " extra folders of type " << ft << " outside of root" << LL_ENDL; + LL_WARNS("Inventory") << "Found " << count_elsewhere << " extra folders of type " << LLFolderType::lookup(folder_type) << "(" << ft << ") outside of root" << LL_ENDL; // FIRE-31634 [OPENSIM] Better inventory validation warnings++; } } diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index cb3e886e16..8ea89d26b6 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -80,6 +80,7 @@ public: bool mFatalQADebugMode; std::set mMissingRequiredSystemFolders; std::set mDuplicateRequiredSystemFolders; + std::ostringstream mLog; // Extra validation logs for OpenSim. }; std::ostream& operator<<(std::ostream& s, const LLInventoryValidationInfo& v); diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index a06217f818..689a2ec9a6 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -3182,6 +3182,7 @@ BOOL LLPanelGroupBanListSubTab::postBuildSubTab(LLView* root) mBanList->setCommitOnSelectionChange(TRUE); mBanList->setCommitCallback(onBanEntrySelect, this); + mBanList->setFilterColumn(0); // FIRE-31653: add banlist filter editor mCreateBanButton->setClickedCallback(onCreateBanEntry, this); mCreateBanButton->setEnabled(FALSE); @@ -3260,6 +3261,13 @@ void LLPanelGroupBanListSubTab::onBanEntrySelect(LLUICtrl* ctrl, void* user_data void LLPanelGroupBanListSubTab::handleBanEntrySelect() { + // FIRE-31653: disable remove ban button when no entry is selected + if (!mBanList->getNumSelected()) + { + mDeleteBanButton->setEnabled(false); + return; + } + // if (gAgent.hasPowerInGroup(mGroupID, GP_GROUP_BAN_ACCESS)) { mDeleteBanButton->setEnabled(TRUE); @@ -3434,3 +3442,13 @@ void LLPanelGroupBanListSubTab::setGroupID(const LLUUID& id) setFooterEnabled(FALSE); LLPanelGroupSubTab::setGroupID(id); } + +// FIRE-31653: add banlist filter editor +void LLPanelGroupBanListSubTab::onFilterChanged() +{ + mBanList->setFilterString(mSearchFilter); + + // disable remove ban button as a change of filter will deselect all entries + mDeleteBanButton->setEnabled(false); +} +// add banlist filter editor diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index 0bee64bce3..9d5df28f4d 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -357,6 +357,7 @@ public: virtual void activate(); virtual void update(LLGroupChange gc); + virtual void onFilterChanged(); // FIRE-31653: add banlist filter editor virtual void draw(); static void onBanEntrySelect(LLUICtrl* ctrl, void* user_data); diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 862b75daf8..1d4be54522 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -4725,6 +4725,14 @@ Wählen Sie eine kleinere Landfläche aus. + + Eine Beschädigung Ihrers Inventars wurde erkannt. +Bitte kontaktieren Sie [HELP] mit der folgenden Liste an Fehlern. +Diese können anhand von http://opensimulator.org/wiki/inventory die erkannten Fehler korrigieren. + +[ERRORS] + + Dadurch werden die Protokolle vorheriger Unterhaltungen und alle Backups dieser Datei gelöscht. diff --git a/indra/newview/skins/default/xui/de/panel_group_roles.xml b/indra/newview/skins/default/xui/de/panel_group_roles.xml index 317708aef9..4c6c7bbd11 100644 --- a/indra/newview/skins/default/xui/de/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/de/panel_group_roles.xml @@ -74,6 +74,7 @@ Rechte in einer Gruppe. Es gibt viele verschiedene Fähigkeiten. Bann-Anzahl: [COUNT]/[LIMIT] + diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index d1c963f44f..c93abd86a8 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -7200,4 +7200,7 @@ Ihre aktuelle Position: [AVATAR_POS] [NUM_ELEMENTS] Elemente + + das Support-Team Ihres Grid-Betreibers + diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 3890ac033a..383f7dad44 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -12801,6 +12801,25 @@ Changes won't take effect until after you restart [APP_NAME]. + + +Corruption has been found in your inventory. +Please contact [HELP] with the following list of issues. +They can use http://opensimulator.org/wiki/inventory to fix the issues. + +[ERRORS] + fail + + Ban count: [COUNT]/[LIMIT] + + + No Elements 1 Element [NUM_ELEMENTS] Elements + your Grid Operator's support team diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 6b2c603efc..6b7f11808e 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -5031,6 +5031,14 @@ Veuillez sélectionner un terrain plus petit. + + Une corruption a été trouvée dans votre inventaire. +Veuillez contacter [HELP] avec la liste de problèmes suivante. +Ils peuvent utiliser http://opensimulator.org/wiki/inventory pour résoudre les problèmes. + +[ERRORS] + + Cela supprimera les journaux des conversations précédentes, ainsi que toute copie de sauvegarde de ce fichier. diff --git a/indra/newview/skins/default/xui/fr/panel_group_roles.xml b/indra/newview/skins/default/xui/fr/panel_group_roles.xml index 3bdbd222a2..af89d4da34 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_roles.xml @@ -1,17 +1,20 @@ - Il y a des modifications non enregistrées - Voulez-vous les enregistrer ? + + Il y a des modifications non enregistrées + + + Voulez-vous les enregistrer ? + - Vous pouvez ajouter ou enlever des rôles assignés aux membres. - Sélectionnez des noms (en utilisant la touche Ctrl et en - cliquant sur leurs noms). + Vous pouvez ajouter ou enlever des rôles assignés aux membres. +Sélectionnez des noms (en utilisant la touche Ctrl et en +cliquant sur leurs noms). - [AREA] m² - + @@ -19,36 +22,44 @@