# Conflicts:
#	autobuild.xml
#	indra/newview/llfloater360capture.cpp
#	indra/newview/llperfstats.cpp
#	indra/newview/llperfstats.h
#	indra/newview/llvoavatar.cpp
#	indra/newview/pipeline.cpp
master
Ansariel 2022-11-23 10:08:56 +01:00
commit 4e87c96292
15 changed files with 47 additions and 61 deletions

View File

@ -1320,9 +1320,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>650e836255b6c2ecb93d3f1f7220051c</string>
<string>dce3f3c01fddb400cb143c3283fe9259</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55011/511905/glh_linear-0.0.0-common-538981.tar.bz2</string>
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82754/775367/glh_linear-0.0.0-common-560278.tar.bz2</string>
</map>
<key>name</key>
<string>common</string>

View File

@ -285,6 +285,7 @@ Beq Janus
SL-15709
SL-16021
SL-18202
SL-18586
Beth Walcher
Bezilon Kasei
Biancaluce Robbiani

View File

@ -26239,17 +26239,6 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>473405</integer>
</map>
<key>FSUseCoRoFor360Capture</key>
<map>
<key>Comment</key>
<string>Use co-routine to extract 360 photos.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SDL2IMEDefaultVerticalOffset</key>
<map>
<key>Comment</key>

View File

@ -394,7 +394,7 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)
LLVOAvatar::AvatarOverallAppearance oa = avatarp->getOverallAppearance();
BOOL impostor = !LLPipeline::sImpostorRender && avatarp->isImpostor();
// no shadows if the shadows are causing this avatar to breach the limit.
if (avatarp->isTooSlowWithShadows() || impostor || (oa == LLVOAvatar::AOA_INVISIBLE))
if (avatarp->isTooSlow() || impostor || (oa == LLVOAvatar::AOA_INVISIBLE))
{
// No shadows for impostored (including jellydolled) or invisible avs.
return;

View File

@ -323,25 +323,7 @@ const std::string LLFloater360Capture::getHTMLBaseFolder()
// triggered when the 'capture' button in the UI is pressed
void LLFloater360Capture::onCapture360ImagesBtn()
{
// <FS:Beq> FIRE-31942 Avoid CoRo that appears to never usefully yield
// Allow option to re-enable on the off chance a low power machine can benefit
if(gSavedSettings.getBOOL("FSUseCoRoFor360Capture"))
{
// </FS:Beq>
// launch the main capture code in a coroutine so we can
// yield/suspend at some points to give the main UI
// thread a look-in occasionally.
LLCoros::instance().launch("capture360cap", [this]()
{
capture360Images();
});
// <FS:Beq> FIRE-31942 Avoid CoRo that appears to never usefully yield
}
else
{
capture360Images();
}
// </FS:Beq>
capture360Images();
}
// Gets the full path name for a given JavaScript file in the HTML folder. We
@ -696,10 +678,6 @@ void LLFloater360Capture::capture360Images()
mCaptureBtn->setEnabled(true);
mSaveLocalBtn->setEnabled(true);
// allow the UI to update by suspending and waiting for the
// main render loop to update the UI
if(gSavedSettings.getBOOL("FSUseCoRoFor360Capture")) // <FS:Beq/> FIRE-31942 - make apparently pointless CoRo optional (just in case)
suspendForAFrame();
}
// once the request is made to navigate to the web page containing the code

View File

@ -262,7 +262,7 @@ void LLFloaterPerformance::populateHUDList()
row[1]["column"] = "complex_value";
row[1]["type"] = "text";
row[1]["value"] = llformat( "%.f",LLPerfStats::raw_to_us(hud_render_time_raw) );
row[1]["value"] = llformat( "%.f", llmax(LLPerfStats::raw_to_us(hud_render_time_raw), (double)1));
row[1]["font"]["name"] = "SANSSERIF";
row[2]["column"] = "name";
@ -321,7 +321,7 @@ void LLFloaterPerformance::populateObjectList()
row[1]["column"] = "complex_value";
row[1]["type"] = "text";
row[1]["value"] = llformat("%.f", LLPerfStats::raw_to_us(attach_render_time_raw));
row[1]["value"] = llformat("%.f", llmax(LLPerfStats::raw_to_us(attach_render_time_raw), (double)1));
row[1]["font"]["name"] = "SANSSERIF";
row[2]["column"] = "name";
@ -372,7 +372,7 @@ void LLFloaterPerformance::populateNearbyList()
auto render_av_raw = LLPerfStats::StatsRecorder::get(AvType, avatar->getID(),LLPerfStats::StatType_t::RENDER_COMBINED);
LLPerfStats::bufferToggleLock.unlock();
auto is_slow = avatar->isTooSlowWithShadows();
auto is_slow = avatar->isTooSlow();
LLSD item;
item["id"] = avatar->getID();
LLSD& row = item["columns"];

View File

@ -59,6 +59,7 @@ LLFloaterPreferenceGraphicsAdvanced::LLFloaterPreferenceGraphicsAdvanced(const L
LLFloaterPreferenceGraphicsAdvanced::~LLFloaterPreferenceGraphicsAdvanced()
{
mComplexityChangedSignal.disconnect();
mLODFactorChangedSignal.disconnect();
}
BOOL LLFloaterPreferenceGraphicsAdvanced::postBuild()
@ -78,8 +79,8 @@ BOOL LLFloaterPreferenceGraphicsAdvanced::postBuild()
use_HiDPI->setVisible(FALSE);
#endif
mComplexityChangedSignal = gSavedSettings.getControl("RenderAvatarMaxComplexity")->getCommitSignal()->connect(boost::bind(&LLFloaterPreferenceGraphicsAdvanced::updateComplexityText, this));
mComplexityChangedSignal = gSavedSettings.getControl("RenderAvatarMaxComplexity")->getCommitSignal()->connect(boost::bind(&LLFloaterPreferenceGraphicsAdvanced::updateComplexityText, this));
mLODFactorChangedSignal = gSavedSettings.getControl("RenderVolumeLODFactor")->getCommitSignal()->connect(boost::bind(&LLFloaterPreferenceGraphicsAdvanced::updateObjectMeshDetailText, this));
return TRUE;
}
@ -165,6 +166,11 @@ void LLFloaterPreferenceGraphicsAdvanced::updateComplexityText()
getChild<LLTextBox>("IndirectMaxComplexityText", true));
}
void LLFloaterPreferenceGraphicsAdvanced::updateObjectMeshDetailText()
{
updateSliderText(getChild<LLSliderCtrl>("ObjectMeshDetail", true), getChild<LLTextBox>("ObjectMeshDetailText", true));
}
void LLFloaterPreferenceGraphicsAdvanced::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box)
{
if (text_box == NULL || ctrl== NULL)

View File

@ -49,6 +49,7 @@ public:
void setMaxNonImpostorsText(U32 value, LLTextBox* text_box);
void updateMaxComplexity();
void updateComplexityText();
void updateObjectMeshDetailText();
void refresh();
// callback for when client modifies a render option
void onRenderOptionEnable();
@ -60,6 +61,7 @@ protected:
void onBtnCancel(const LLSD& userdata);
boost::signals2::connection mComplexityChangedSignal;
boost::signals2::connection mLODFactorChangedSignal;
};
#endif //LLFLOATERPREFERENCEGRAPHICSADVANCED_H

View File

@ -54,6 +54,8 @@ namespace LLPerfStats
std::mutex bufferToggleLock{};
F64 cpu_hertz{0.0}; // <FS:Beq/> reinstate threadsafe frequency
F64 cpu_hertz{0.0};
Tunables tunables;
std::atomic<int> StatsRecorder::writeBuffer{0};
@ -137,7 +139,8 @@ namespace LLPerfStats
// create a queue
// create a thread to consume from the queue
tunables.initialiseFromSettings();
LLPerfStats::cpu_hertz = (F64)LLTrace::BlockTimer::countsPerSecond(); // <FS:Beq/> reinstate threadsafe frequency
LLPerfStats::cpu_hertz = (F64)LLTrace::BlockTimer::countsPerSecond();
t.detach();
}
@ -346,7 +349,7 @@ namespace LLPerfStats
}
// The frametime budget we have based on the target FPS selected
auto target_frame_time_raw = (U64)llround(LLPerfStats::cpu_hertz/(tunables.userTargetFPS==0?1:tunables.userTargetFPS));// <FS:Beq/> reinstate threadsafe frequency
auto target_frame_time_raw = (U64)llround(LLPerfStats::cpu_hertz/(tunables.userTargetFPS==0?1:tunables.userTargetFPS));
// LL_INFOS() << "Effective FPS(raw):" << tot_frame_time_raw << " Target:" << target_frame_time_raw << LL_ENDL;
auto inferredFPS{1000/(U32)std::max(raw_to_ms(tot_frame_time_raw),1.0)};
U32 settingsChangeFrequency{inferredFPS > 25?inferredFPS:25};

View File

@ -78,6 +78,8 @@ namespace LLPerfStats
static constexpr U32 TUNE_SCENE_AND_AVATARS{1};
extern F64 cpu_hertz; // <FS:Beq/> reinstate thread safety
extern F64 cpu_hertz;
extern std::atomic<int64_t> tunedAvatars;
extern std::atomic<U64> renderAvatarMaxART_ns;
extern bool belowTargetFPS;
@ -525,15 +527,10 @@ namespace LLPerfStats
StatsRecorder::send(std::move(stat));
};
};
// <FS:Beq> use thread safe/low overhead cpu frequency tracking (might need to add refresh to this)
// inline double raw_to_ns(U64 raw) { return (static_cast<double>(raw) * 1000000000.0) / (F64)LLTrace::BlockTimer::countsPerSecond(); };
// inline double raw_to_us(U64 raw) { return (static_cast<double>(raw) * 1000000.0) / (F64)LLTrace::BlockTimer::countsPerSecond(); };
// inline double raw_to_ms(U64 raw) { return (static_cast<double>(raw) * 1000.0) / (F64)LLTrace::BlockTimer::countsPerSecond(); };
inline double raw_to_ns(U64 raw) { return (static_cast<double>(raw) * 1000000000.0) / LLPerfStats::cpu_hertz; };
inline double raw_to_us(U64 raw) { return (static_cast<double>(raw) * 1000000.0) / LLPerfStats::cpu_hertz; };
inline double raw_to_ms(U64 raw) { return (static_cast<double>(raw) * 1000.0) / LLPerfStats::cpu_hertz; };
// </FS:Beq>
using RecordSceneTime = RecordTime<ObjType_t::OT_GENERAL>;
using RecordAvatarTime = RecordTime<ObjType_t::OT_AVATAR>;

View File

@ -718,7 +718,7 @@ void LLViewerPartSim::updateSimulation()
if (upd && vobj && (vobj->getPCode() == LL_PCODE_VOLUME))
{
if(vobj->getAvatar() && vobj->getAvatar()->isTooComplex() && vobj->getAvatar()->isTooSlowWithShadows())
if(vobj->getAvatar() && vobj->getAvatar()->isTooComplex() && vobj->getAvatar()->isTooSlow())
{
upd = FALSE;
}

View File

@ -3359,7 +3359,7 @@ void LLVOAvatar::idleUpdateLoadingEffect()
// Firestorm Clouds
// do not generate particles for dummy or overly-complex avatars
if (!mIsDummy && !isTooComplex() && !isTooSlowWithShadows())
if (!mIsDummy && !isTooComplex() && !isTooSlow())
{
setParticleSource(sCloud, getID());
}
@ -9223,6 +9223,18 @@ bool LLVOAvatar::isTooComplex() const
return too_complex;
}
bool LLVOAvatar::isTooSlow() const
{
static LLCachedControl<bool> always_render_friends(gSavedSettings, "AlwaysRenderFriends");
bool render_friend = (LLAvatarTracker::instance().isBuddy(getID()) && always_render_friends);
if (render_friend || mVisuallyMuteSetting == AV_ALWAYS_RENDER)
{
return false;
}
return mTooSlow;
}
// use Avatar Render Time as complexity metric
// <FS:Beq> refactor for clarity post LL merge
void LLVOAvatar::clearSlowARTCache()
@ -12468,7 +12480,7 @@ void LLVOAvatar::calcMutedAVColor()
change_msg = " blocked: color is grey4";
}
// <FS:Beq> we don't want jelly dolls
// else if (!isTooComplex() && !isTooSlowWithShadows())
// else if (!isTooComplex() && !isTooSlow())
else if (!isTooComplex())
// </FS:Beq>
{

View File

@ -370,12 +370,10 @@ public:
// check and return current state relative to limits
// default will test only the geometry (combined=false).
// this allows us to disable shadows separately on complex avatars.
inline bool isTooSlowWithShadows() const {return mTooSlow;};
inline bool isTooSlowWithoutShadows() const {return mTooSlowWithoutShadows;};
inline bool isTooSlow(bool combined = false) const
{
return(combined?mTooSlow:mTooSlowWithoutShadows);
}
bool isTooSlow() const;
void updateTooSlow();
virtual bool isTooComplex() const; // <FS:Ansariel> FIRE-29012: Standalone animesh avatars get affected by complexity limit; changed to virtual

View File

@ -6223,7 +6223,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
LLDrawable* drawable = light->drawable;
const LLViewerObject *vobj = light->drawable->getVObj();
if(vobj && vobj->getAvatar()
&& (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList() || vobj->getAvatar()->isTooSlowWithShadows())
&& (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList() || vobj->getAvatar()->isTooSlow())
)
{
drawable->clearState(LLDrawable::NEARBY_LIGHT);
@ -6302,7 +6302,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
continue;
}
LLVOAvatar * av = light->getAvatar();
if (av && (av->isTooComplex() || av->isInMuteList() || av->isTooSlowWithShadows()))
if (av && (av->isTooComplex() || av->isInMuteList() || av->isTooSlow()))
{
// avatars that are already in the list will be removed by removeMutedAVsLights
continue;

View File

@ -522,8 +522,8 @@
label_width="185"
layout="topleft"
left="420"
min_val="1"
max_val="2"
min_val="0"
max_val="4"
name="ObjectMeshDetail"
show_text="false"
top_delta="16"