Merge branch 'develop' of https://github.com/secondlife/viewer
# Conflicts: # indra/newview/llreflectionmapmanager.cpp # indra/newview/llviewercontrol.cpp # indra/newview/pipeline.cppmaster
commit
0573e31002
|
|
@ -47,13 +47,21 @@ jobs:
|
||||||
artifact: Windows-installer
|
artifact: Windows-installer
|
||||||
install-path: 'C:\viewer-automation-main'
|
install-path: 'C:\viewer-automation-main'
|
||||||
- os: windows
|
- os: windows
|
||||||
runner: qa-windows-z600-dan
|
runner: qa-windows-kurt
|
||||||
artifact: Windows-installer
|
artifact: Windows-installer
|
||||||
install-path: 'C:\viewer-automation-main'
|
install-path: 'C:\viewer-automation-main'
|
||||||
|
- os: mac
|
||||||
|
runner: qa-mac-dan
|
||||||
|
artifact: macOS-installer
|
||||||
|
install-path: '$HOME/Documents/viewer-automation'
|
||||||
- os: mac
|
- os: mac
|
||||||
runner: qa-mac-atlas
|
runner: qa-mac-atlas
|
||||||
artifact: macOS-installer
|
artifact: macOS-installer
|
||||||
install-path: '$HOME/Documents/viewer-automation'
|
install-path: '$HOME/Documents/viewer-automation'
|
||||||
|
- os: mac
|
||||||
|
runner: qa-mac-caleb
|
||||||
|
artifact: macOS-installer
|
||||||
|
install-path: '$HOME/Documents/viewer-automation'
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
|
||||||
runs-on: [self-hosted, "${{ matrix.runner }}"]
|
runs-on: [self-hosted, "${{ matrix.runner }}"]
|
||||||
|
|
|
||||||
|
|
@ -1199,6 +1199,7 @@ void LLFloaterPreference::onOpen(const LLSD& key)
|
||||||
|
|
||||||
// Forget previous language changes.
|
// Forget previous language changes.
|
||||||
mLanguageChanged = false;
|
mLanguageChanged = false;
|
||||||
|
mLastQualityLevel = gSavedSettings.getU32("RenderQualityPerformance");
|
||||||
|
|
||||||
// Display selected maturity icons.
|
// Display selected maturity icons.
|
||||||
onChangeMaturity();
|
onChangeMaturity();
|
||||||
|
|
@ -2381,6 +2382,33 @@ void LLFloaterPreference::onCommitWindowedMode()
|
||||||
void LLFloaterPreference::onChangeQuality(const LLSD& data)
|
void LLFloaterPreference::onChangeQuality(const LLSD& data)
|
||||||
{
|
{
|
||||||
U32 level = (U32)(data.asReal());
|
U32 level = (U32)(data.asReal());
|
||||||
|
constexpr U32 LVL_HIGH = 4;
|
||||||
|
if (level >= LVL_HIGH && mLastQualityLevel < level)
|
||||||
|
{
|
||||||
|
constexpr U32 LOW_MEM_THRESHOLD = 4097;
|
||||||
|
U32 total_mem = (U32Megabytes)LLMemory::getMaxMemKB();
|
||||||
|
if (total_mem < LOW_MEM_THRESHOLD)
|
||||||
|
{
|
||||||
|
LLSD args;
|
||||||
|
args["TOTAL_MEM"] = LLSD::Integer(total_mem);
|
||||||
|
LLNotificationsUtil::add("PreferenceQualityWithLowMemory", args, LLSD(), [this](const LLSD& notification, const LLSD& response)
|
||||||
|
{
|
||||||
|
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||||
|
// If cancel pressed
|
||||||
|
if (option == 1)
|
||||||
|
{
|
||||||
|
constexpr U32 LVL_MED_PLUS = 3;
|
||||||
|
gSavedSettings.setU32("RenderQualityPerformance", LVL_MED_PLUS);
|
||||||
|
mLastQualityLevel = LVL_MED_PLUS;
|
||||||
|
LLFeatureManager::getInstance()->setGraphicsLevel(LVL_MED_PLUS, true);
|
||||||
|
refreshEnabledGraphics();
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mLastQualityLevel = level;
|
||||||
LLFeatureManager::getInstance()->setGraphicsLevel(level, true);
|
LLFeatureManager::getInstance()->setGraphicsLevel(level, true);
|
||||||
refreshEnabledGraphics();
|
refreshEnabledGraphics();
|
||||||
refresh();
|
refresh();
|
||||||
|
|
|
||||||
|
|
@ -315,6 +315,7 @@ private:
|
||||||
bool mOriginalIMViaEmail;
|
bool mOriginalIMViaEmail;
|
||||||
bool mLanguageChanged;
|
bool mLanguageChanged;
|
||||||
bool mAvatarDataInitialized;
|
bool mAvatarDataInitialized;
|
||||||
|
U32 mLastQualityLevel = 0;
|
||||||
std::string mPriorInstantMessageLogPath;
|
std::string mPriorInstantMessageLogPath;
|
||||||
|
|
||||||
bool mOriginalHideOnlineStatus;
|
bool mOriginalHideOnlineStatus;
|
||||||
|
|
|
||||||
|
|
@ -2567,7 +2567,7 @@ bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 dat
|
||||||
LLPointer<LLMeshSkinInfo> info = nullptr;
|
LLPointer<LLMeshSkinInfo> info = nullptr;
|
||||||
info = new LLMeshSkinInfo(mesh_id, skin);
|
info = new LLMeshSkinInfo(mesh_id, skin);
|
||||||
|
|
||||||
if (isAgentAvatarValid())
|
if (isAgentAvatarValid() && gAgentAvatarp->mInitFlags != 0)
|
||||||
{ // joint numbers are consistent inside LLVOAvatar and animations, but inconsistent inside meshes,
|
{ // joint numbers are consistent inside LLVOAvatar and animations, but inconsistent inside meshes,
|
||||||
// generate a map of mesh joint numbers to LLVOAvatar joint numbers
|
// generate a map of mesh joint numbers to LLVOAvatar joint numbers
|
||||||
LLSkinningUtil::initJointNums(info, gAgentAvatarp);
|
LLSkinningUtil::initJointNums(info, gAgentAvatarp);
|
||||||
|
|
|
||||||
|
|
@ -222,15 +222,11 @@ void LLReflectionMapManager::update()
|
||||||
resume();
|
resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
static LLCachedControl<S32> sDetail(gSavedSettings, "RenderReflectionProbeDetail", -1);
|
|
||||||
// static LLCachedControl<S32> sLevel(gSavedSettings, "RenderReflectionProbeLevel", 3); // <FS:Beq/> No longer required use the pipeline cached version instead
|
|
||||||
static LLCachedControl<U32> sReflectionProbeCount(gSavedSettings, "RenderReflectionProbeCount", 256U);
|
|
||||||
static LLCachedControl<S32> sProbeDynamicAllocation(gSavedSettings, "RenderReflectionProbeDynamicAllocation", -1);
|
|
||||||
mResetFade = llmin((F32)(mResetFade + gFrameIntervalSeconds * 2.f), 1.f);
|
mResetFade = llmin((F32)(mResetFade + gFrameIntervalSeconds * 2.f), 1.f);
|
||||||
|
|
||||||
{
|
{
|
||||||
U32 probe_count_temp = mDynamicProbeCount;
|
U32 probe_count_temp = mDynamicProbeCount;
|
||||||
if (sProbeDynamicAllocation > -1)
|
if (mRenderReflectionProbeDynamicAllocation > -1)
|
||||||
{
|
{
|
||||||
if (LLPipeline::sReflectionProbeLevel == (S32)LLReflectionMap::ProbeLevel::NONE)// <FS:Beq/> No longer required use the pipeline cached version instead
|
if (LLPipeline::sReflectionProbeLevel == (S32)LLReflectionMap::ProbeLevel::NONE)// <FS:Beq/> No longer required use the pipeline cached version instead
|
||||||
{
|
{
|
||||||
|
|
@ -249,20 +245,20 @@ void LLReflectionMapManager::update()
|
||||||
mDynamicProbeCount = 256;
|
mDynamicProbeCount = 256;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sProbeDynamicAllocation > 1)
|
if (mRenderReflectionProbeDynamicAllocation > 1)
|
||||||
{
|
{
|
||||||
// Round mDynamicProbeCount to the nearest increment of 16
|
// Round mDynamicProbeCount to the nearest increment of 16
|
||||||
mDynamicProbeCount = ((mDynamicProbeCount + sProbeDynamicAllocation / 2) / sProbeDynamicAllocation) * 16;
|
mDynamicProbeCount = ((mDynamicProbeCount + mRenderReflectionProbeDynamicAllocation / 2) / mRenderReflectionProbeDynamicAllocation) * 16;
|
||||||
mDynamicProbeCount = llclamp(mDynamicProbeCount, 1, sReflectionProbeCount);
|
mDynamicProbeCount = llclamp(mDynamicProbeCount, 1, mRenderReflectionProbeCount);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mDynamicProbeCount = llclamp(mDynamicProbeCount + sProbeDynamicAllocation, 1, sReflectionProbeCount);
|
mDynamicProbeCount = llclamp(mDynamicProbeCount + mRenderReflectionProbeDynamicAllocation, 1, mRenderReflectionProbeCount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mDynamicProbeCount = sReflectionProbeCount;
|
mDynamicProbeCount = mRenderReflectionProbeCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
mDynamicProbeCount = llmin(mDynamicProbeCount, LL_MAX_REFLECTION_PROBE_COUNT);
|
mDynamicProbeCount = llmin(mDynamicProbeCount, LL_MAX_REFLECTION_PROBE_COUNT);
|
||||||
|
|
@ -328,7 +324,7 @@ void LLReflectionMapManager::update()
|
||||||
|
|
||||||
bool did_update = false;
|
bool did_update = false;
|
||||||
|
|
||||||
bool realtime = sDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME;
|
bool realtime = mRenderReflectionProbeDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME;
|
||||||
|
|
||||||
LLReflectionMap* closestDynamic = nullptr;
|
LLReflectionMap* closestDynamic = nullptr;
|
||||||
|
|
||||||
|
|
@ -458,7 +454,7 @@ void LLReflectionMapManager::update()
|
||||||
}
|
}
|
||||||
// <FS:Beq> This code is no longer required and this update loop should self-cleanse
|
// <FS:Beq> This code is no longer required and this update loop should self-cleanse
|
||||||
// However: There appears to be something that causes the reference count to be 2 for some probes that should no longer be in use.
|
// However: There appears to be something that causes the reference count to be 2 for some probes that should no longer be in use.
|
||||||
// if (sLevel == 0)
|
// if (mRenderReflectionProbeLevel == 0)
|
||||||
// {
|
// {
|
||||||
// // only update default probe when coverage is set to none
|
// // only update default probe when coverage is set to none
|
||||||
// llassert(probe == mDefaultProbe);
|
// llassert(probe == mDefaultProbe);
|
||||||
|
|
@ -522,6 +518,14 @@ void LLReflectionMapManager::update()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LLReflectionMapManager::refreshSettings()
|
||||||
|
{
|
||||||
|
mRenderReflectionProbeDetail = gSavedSettings.getS32("RenderReflectionProbeDetail");
|
||||||
|
//mRenderReflectionProbeLevel = gSavedSettings.getS32("RenderReflectionProbeLevel"); // <FS:Beq/> No longer required use the pipeline cached version instead
|
||||||
|
mRenderReflectionProbeCount = gSavedSettings.getU32("RenderReflectionProbeCount");
|
||||||
|
mRenderReflectionProbeDynamicAllocation = gSavedSettings.getS32("RenderReflectionProbeDynamicAllocation");
|
||||||
|
}
|
||||||
|
|
||||||
LLReflectionMap* LLReflectionMapManager::addProbe(LLSpatialGroup* group)
|
LLReflectionMap* LLReflectionMapManager::addProbe(LLSpatialGroup* group)
|
||||||
{
|
{
|
||||||
if (gGLManager.mGLVersion < 4.05f || !LLPipeline::sReflectionProbesEnabled)
|
if (gGLManager.mGLVersion < 4.05f || !LLPipeline::sReflectionProbesEnabled)
|
||||||
|
|
@ -793,7 +797,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
llassert(gSavedSettings.getS32("RenderReflectionProbeLevel") > 0); // should never update a probe that's not the default probe if reflection coverage is none
|
llassert(mRenderReflectionProbeLevel > 0); // should never update a probe that's not the default probe if reflection coverage is none
|
||||||
probe->update(mRenderTarget.getWidth(), face);
|
probe->update(mRenderTarget.getWidth(), face);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,8 @@ public:
|
||||||
// maintain reflection probes
|
// maintain reflection probes
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
|
void refreshSettings();
|
||||||
|
|
||||||
// add a probe for the given spatial group
|
// add a probe for the given spatial group
|
||||||
LLReflectionMap* addProbe(LLSpatialGroup* group = nullptr);
|
LLReflectionMap* addProbe(LLSpatialGroup* group = nullptr);
|
||||||
|
|
||||||
|
|
@ -247,6 +249,12 @@ private:
|
||||||
|
|
||||||
U32 mDynamicProbeCount;
|
U32 mDynamicProbeCount;
|
||||||
|
|
||||||
|
// cached settings from gSavedSettings
|
||||||
|
S32 mRenderReflectionProbeDetail = -1;
|
||||||
|
S32 mRenderReflectionProbeLevel = 3;
|
||||||
|
U32 mRenderReflectionProbeCount = 256U;
|
||||||
|
S32 mRenderReflectionProbeDynamicAllocation = -1;
|
||||||
|
|
||||||
// resolution of reflection probes
|
// resolution of reflection probes
|
||||||
U32 mProbeResolution = 128;
|
U32 mProbeResolution = 128;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -557,23 +557,9 @@ static bool handleRenderDynamicLODChanged(const LLSD& newvalue)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// static bool handleReflectionsEnabled(const LLSD& newvalue)
|
|
||||||
// {
|
|
||||||
// // <FS:Beq> FIRE-33659 - everything is too dark when reflections are disabled.
|
|
||||||
// if(newvalue.asBoolean())
|
|
||||||
// {
|
|
||||||
// // TODO(Beq): This setting level should probably be governed by render quality settings.
|
|
||||||
// gSavedSettings.setS32("RenderReflectionProbeLevel", 3);
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// gSavedSettings.setS32("RenderReflectionProbeLevel", 0);
|
|
||||||
// }
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
|
|
||||||
static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)
|
static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)
|
||||||
{
|
{
|
||||||
|
gPipeline.mReflectionMapManager.refreshSettings();
|
||||||
if (gPipeline.isInit())
|
if (gPipeline.isInit())
|
||||||
{
|
{
|
||||||
LLPipeline::refreshCachedSettings();
|
LLPipeline::refreshCachedSettings();
|
||||||
|
|
@ -586,6 +572,12 @@ static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool handleReflectionProbeCountChanged(const LLSD& newvalue)
|
||||||
|
{
|
||||||
|
gPipeline.mReflectionMapManager.refreshSettings();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#if LL_DARWIN
|
#if LL_DARWIN
|
||||||
static bool handleAppleUseMultGLChanged(const LLSD& newvalue)
|
static bool handleAppleUseMultGLChanged(const LLSD& newvalue)
|
||||||
{
|
{
|
||||||
|
|
@ -1317,7 +1309,8 @@ void settings_setup_listeners()
|
||||||
// [/SL:KB]
|
// [/SL:KB]
|
||||||
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeLevel", handleReflectionProbeDetailChanged);
|
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeLevel", handleReflectionProbeDetailChanged);
|
||||||
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged);
|
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged);
|
||||||
// setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionsEnabled); // <FS:Beq/> FIRE-33659 better way to enable/disable reflections
|
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeCount", handleReflectionProbeCountChanged);
|
||||||
|
setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged);
|
||||||
#if LL_DARWIN
|
#if LL_DARWIN
|
||||||
setting_setup_signal_listener(gSavedSettings, "RenderAppleUseMultGL", handleAppleUseMultGLChanged);
|
setting_setup_signal_listener(gSavedSettings, "RenderAppleUseMultGL", handleAppleUseMultGLChanged);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -4284,6 +4284,17 @@ void send_agent_update(bool force_send, bool send_reliable)
|
||||||
msg->addVector3Fast(_PREHASH_CameraUpAxis, LLViewerCamera::getInstance()->getUpAxis());
|
msg->addVector3Fast(_PREHASH_CameraUpAxis, LLViewerCamera::getInstance()->getUpAxis());
|
||||||
|
|
||||||
static F32 last_draw_disatance_step = 1024;
|
static F32 last_draw_disatance_step = 1024;
|
||||||
|
F32 memory_limited_draw_distance = gAgentCamera.mDrawDistance;
|
||||||
|
|
||||||
|
if (LLViewerTexture::sDesiredDiscardBias > 2.f && LLViewerTexture::isSystemMemoryLow())
|
||||||
|
{
|
||||||
|
// If we are low on memory, reduce requested draw distance
|
||||||
|
// Discard's bias is clamped to 4 so we need to check 2 to 4 range
|
||||||
|
// Factor is intended to go from 1.0 to 2.0
|
||||||
|
F32 factor = 1.f + (LLViewerTexture::sDesiredDiscardBias - 2.f) / 2.f;
|
||||||
|
memory_limited_draw_distance = llmax(gAgentCamera.mDrawDistance / factor, gAgentCamera.mDrawDistance / 2.f);
|
||||||
|
}
|
||||||
|
|
||||||
if (tp_state == LLAgent::TELEPORT_ARRIVING || LLStartUp::getStartupState() < STATE_MISC)
|
if (tp_state == LLAgent::TELEPORT_ARRIVING || LLStartUp::getStartupState() < STATE_MISC)
|
||||||
{
|
{
|
||||||
// Inform interest list, prioritize closer area.
|
// Inform interest list, prioritize closer area.
|
||||||
|
|
@ -4292,25 +4303,25 @@ void send_agent_update(bool force_send, bool send_reliable)
|
||||||
// closer ones.
|
// closer ones.
|
||||||
// Todo: revise and remove once server gets distance sorting.
|
// Todo: revise and remove once server gets distance sorting.
|
||||||
last_draw_disatance_step = llmax((F32)(gAgentCamera.mDrawDistance / 2.f), 50.f);
|
last_draw_disatance_step = llmax((F32)(gAgentCamera.mDrawDistance / 2.f), 50.f);
|
||||||
|
last_draw_disatance_step = llmin(last_draw_disatance_step, memory_limited_draw_distance);
|
||||||
msg->addF32Fast(_PREHASH_Far, last_draw_disatance_step);
|
msg->addF32Fast(_PREHASH_Far, last_draw_disatance_step);
|
||||||
}
|
}
|
||||||
else if (last_draw_disatance_step < gAgentCamera.mDrawDistance)
|
else if (last_draw_disatance_step < memory_limited_draw_distance)
|
||||||
{
|
{
|
||||||
static LLFrameTimer last_step_time;
|
static LLFrameTimer last_step_time;
|
||||||
if (last_step_time.getElapsedTimeF32() > 1.f)
|
if (last_step_time.getElapsedTimeF32() > 1.f)
|
||||||
{
|
{
|
||||||
// gradually increase draw distance
|
// gradually increase draw distance
|
||||||
// Idealy this should be not per second, but based on how loaded
|
|
||||||
// mesh thread is, but hopefully this is temporary.
|
|
||||||
last_step_time.reset();
|
last_step_time.reset();
|
||||||
F32 step = gAgentCamera.mDrawDistance * 0.1f;
|
F32 step = memory_limited_draw_distance * 0.1f;
|
||||||
last_draw_disatance_step = llmin(last_draw_disatance_step + step, gAgentCamera.mDrawDistance);
|
last_draw_disatance_step = llmin(last_draw_disatance_step + step, memory_limited_draw_distance);
|
||||||
}
|
}
|
||||||
msg->addF32Fast(_PREHASH_Far, last_draw_disatance_step);
|
msg->addF32Fast(_PREHASH_Far, last_draw_disatance_step);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
msg->addF32Fast(_PREHASH_Far, gAgentCamera.mDrawDistance);
|
last_draw_disatance_step = memory_limited_draw_distance;
|
||||||
|
msg->addF32Fast(_PREHASH_Far, memory_limited_draw_distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg->addU32Fast(_PREHASH_ControlFlags, control_flags);
|
msg->addU32Fast(_PREHASH_ControlFlags, control_flags);
|
||||||
|
|
|
||||||
|
|
@ -547,8 +547,16 @@ void LLViewerTexture::updateClass()
|
||||||
|
|
||||||
if (is_low && !was_low)
|
if (is_low && !was_low)
|
||||||
{
|
{
|
||||||
// slam to 1.5 bias the moment we hit low memory (discards off screen textures immediately)
|
if (is_sys_low)
|
||||||
|
{
|
||||||
|
// Not having system memory is more serious, so discard harder
|
||||||
|
sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f * getSystemMemoryBudgetFactor());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Slam to 1.5 bias the moment we hit low memory (discards off screen textures immediately)
|
||||||
sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f);
|
sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f);
|
||||||
|
}
|
||||||
|
|
||||||
if (is_sys_low || over_pct > 2.f)
|
if (is_sys_low || over_pct > 2.f)
|
||||||
{ // if we're low on system memory, emergency purge off screen textures to avoid a death spiral
|
{ // if we're low on system memory, emergency purge off screen textures to avoid a death spiral
|
||||||
|
|
@ -582,8 +590,13 @@ void LLViewerTexture::updateClass()
|
||||||
sEvaluationTimer.reset();
|
sEvaluationTimer.reset();
|
||||||
|
|
||||||
// lower discard bias over time when at least 10% of budget is free
|
// lower discard bias over time when at least 10% of budget is free
|
||||||
const F32 FREE_PERCENTAGE_TRESHOLD = -0.1f;
|
constexpr F32 FREE_PERCENTAGE_TRESHOLD = -0.1f;
|
||||||
if (sDesiredDiscardBias > 1.f && over_pct < FREE_PERCENTAGE_TRESHOLD)
|
constexpr U32 FREE_SYS_MEM_TRESHOLD = 100;
|
||||||
|
static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512);
|
||||||
|
const S32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory() + FREE_SYS_MEM_TRESHOLD);
|
||||||
|
if (sDesiredDiscardBias > 1.f
|
||||||
|
&& over_pct < FREE_PERCENTAGE_TRESHOLD
|
||||||
|
&& getFreeSystemMemory() > MIN_FREE_MAIN_MEMORY)
|
||||||
{
|
{
|
||||||
static LLCachedControl<F32> high_mem_discard_decrement(gSavedSettings, "RenderHighMemMinDiscardDecrement", .1f);
|
static LLCachedControl<F32> high_mem_discard_decrement(gSavedSettings, "RenderHighMemMinDiscardDecrement", .1f);
|
||||||
|
|
||||||
|
|
@ -650,24 +663,42 @@ void LLViewerTexture::updateClass()
|
||||||
}
|
}
|
||||||
|
|
||||||
//static
|
//static
|
||||||
bool LLViewerTexture::isSystemMemoryLow()
|
U32Megabytes LLViewerTexture::getFreeSystemMemory()
|
||||||
{
|
{
|
||||||
static LLFrameTimer timer;
|
static LLFrameTimer timer;
|
||||||
static U32Megabytes physical_res = U32Megabytes(U32_MAX);
|
static U32Megabytes physical_res = U32Megabytes(U32_MAX);
|
||||||
|
|
||||||
static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512);
|
|
||||||
const U32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory);
|
|
||||||
|
|
||||||
if (timer.getElapsedTimeF32() < MEMORY_CHECK_WAIT_TIME) //call this once per second.
|
if (timer.getElapsedTimeF32() < MEMORY_CHECK_WAIT_TIME) //call this once per second.
|
||||||
{
|
{
|
||||||
return physical_res < MIN_FREE_MAIN_MEMORY;
|
return physical_res;
|
||||||
}
|
}
|
||||||
|
|
||||||
timer.reset();
|
timer.reset();
|
||||||
|
|
||||||
LLMemory::updateMemoryInfo();
|
LLMemory::updateMemoryInfo();
|
||||||
physical_res = LLMemory::getAvailableMemKB();
|
physical_res = LLMemory::getAvailableMemKB();
|
||||||
return physical_res < MIN_FREE_MAIN_MEMORY;
|
return physical_res;
|
||||||
|
}
|
||||||
|
|
||||||
|
//static
|
||||||
|
bool LLViewerTexture::isSystemMemoryLow()
|
||||||
|
{
|
||||||
|
static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512);
|
||||||
|
const U32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory);
|
||||||
|
return getFreeSystemMemory() < MIN_FREE_MAIN_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
F32 LLViewerTexture::getSystemMemoryBudgetFactor()
|
||||||
|
{
|
||||||
|
static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512);
|
||||||
|
const S32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory);
|
||||||
|
S32 free_budget = (S32Megabytes)getFreeSystemMemory() - MIN_FREE_MAIN_MEMORY;
|
||||||
|
if (free_budget < 0)
|
||||||
|
{
|
||||||
|
// Result should range from 1 (0 free budget) to 2 (-512 free budget)
|
||||||
|
return 1.f - free_budget / MIN_FREE_MAIN_MEMORY;
|
||||||
|
}
|
||||||
|
return 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
//end of static functions
|
//end of static functions
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,7 @@ public:
|
||||||
static void initClass();
|
static void initClass();
|
||||||
static void updateClass();
|
static void updateClass();
|
||||||
static bool isSystemMemoryLow();
|
static bool isSystemMemoryLow();
|
||||||
|
static F32 getSystemMemoryBudgetFactor();
|
||||||
|
|
||||||
LLViewerTexture(bool usemipmaps = true);
|
LLViewerTexture(bool usemipmaps = true);
|
||||||
LLViewerTexture(const LLUUID& id, bool usemipmaps) ;
|
LLViewerTexture(const LLUUID& id, bool usemipmaps) ;
|
||||||
|
|
@ -194,6 +195,8 @@ private:
|
||||||
friend class LLBumpImageList;
|
friend class LLBumpImageList;
|
||||||
friend class LLUIImageList;
|
friend class LLUIImageList;
|
||||||
|
|
||||||
|
static U32Megabytes getFreeSystemMemory();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class LLViewerTextureList;
|
friend class LLViewerTextureList;
|
||||||
LLUUID mID;
|
LLUUID mID;
|
||||||
|
|
|
||||||
|
|
@ -503,14 +503,23 @@ void LLVOCacheEntry::updateDebugSettings()
|
||||||
//min radius: all objects within this radius remain loaded in memory
|
//min radius: all objects within this radius remain loaded in memory
|
||||||
static LLCachedControl<F32> min_radius(gSavedSettings,"SceneLoadMinRadius");
|
static LLCachedControl<F32> min_radius(gSavedSettings,"SceneLoadMinRadius");
|
||||||
static const F32 MIN_RADIUS = 1.0f;
|
static const F32 MIN_RADIUS = 1.0f;
|
||||||
const F32 draw_radius = gAgentCamera.mDrawDistance;
|
|
||||||
|
F32 draw_radius = gAgentCamera.mDrawDistance;
|
||||||
|
if (LLViewerTexture::sDesiredDiscardBias > 2.f && LLViewerTexture::isSystemMemoryLow())
|
||||||
|
{
|
||||||
|
// Discard's bias maximum is 4 so we need to check 2 to 4 range
|
||||||
|
// Factor is intended to go from 1.0 to 2.0
|
||||||
|
F32 factor = 1.f + (LLViewerTexture::sDesiredDiscardBias - 2.f) / 2.f;
|
||||||
|
// For safety cap reduction at 50%, we don't want to go below half of draw distance
|
||||||
|
draw_radius = llmax(draw_radius / factor, draw_radius / 2.f);
|
||||||
|
}
|
||||||
const F32 clamped_min_radius = llclamp((F32) min_radius, MIN_RADIUS, draw_radius); // [1, mDrawDistance]
|
const F32 clamped_min_radius = llclamp((F32) min_radius, MIN_RADIUS, draw_radius); // [1, mDrawDistance]
|
||||||
sNearRadius = MIN_RADIUS + ((clamped_min_radius - MIN_RADIUS) * adjust_factor);
|
sNearRadius = MIN_RADIUS + ((clamped_min_radius - MIN_RADIUS) * adjust_factor);
|
||||||
|
|
||||||
// a percentage of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold
|
// a percentage of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold
|
||||||
static LLCachedControl<F32> rear_max_radius_frac(gSavedSettings,"SceneLoadRearMaxRadiusFraction");
|
static LLCachedControl<F32> rear_max_radius_frac(gSavedSettings,"SceneLoadRearMaxRadiusFraction");
|
||||||
const F32 min_radius_plus_one = sNearRadius + 1.f;
|
const F32 min_radius_plus_one = sNearRadius + 1.f;
|
||||||
const F32 max_radius = rear_max_radius_frac * gAgentCamera.mDrawDistance;
|
const F32 max_radius = rear_max_radius_frac * draw_radius;
|
||||||
const F32 clamped_max_radius = llclamp(max_radius, min_radius_plus_one, draw_radius); // [sNearRadius, mDrawDistance]
|
const F32 clamped_max_radius = llclamp(max_radius, min_radius_plus_one, draw_radius); // [sNearRadius, mDrawDistance]
|
||||||
sRearFarRadius = min_radius_plus_one + ((clamped_max_radius - min_radius_plus_one) * adjust_factor);
|
sRearFarRadius = min_radius_plus_one + ((clamped_max_radius - min_radius_plus_one) * adjust_factor);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -473,6 +473,8 @@ void LLPipeline::init()
|
||||||
sRenderBeacons = gSavedSettings.getBOOL("renderbeacons");
|
sRenderBeacons = gSavedSettings.getBOOL("renderbeacons");
|
||||||
sRenderHighlight = gSavedSettings.getBOOL("renderhighlights");
|
sRenderHighlight = gSavedSettings.getBOOL("renderhighlights");
|
||||||
|
|
||||||
|
mReflectionMapManager.refreshSettings();
|
||||||
|
|
||||||
mInitialized = true;
|
mInitialized = true;
|
||||||
|
|
||||||
stop_glerror();
|
stop_glerror();
|
||||||
|
|
|
||||||
|
|
@ -4956,6 +4956,10 @@ Diese können anhand von http://opensimulator.org/wiki/inventory die erkannten F
|
||||||
Dateien können nicht verschoben werden. Vorheriger Pfad wurde wiederhergestellt.
|
Dateien können nicht verschoben werden. Vorheriger Pfad wurde wiederhergestellt.
|
||||||
<usetemplate ignoretext="Dateien können nicht verschoben werden. Vorheriger Pfad wurde wiederhergestellt." name="okignore" yestext="OK"/>
|
<usetemplate ignoretext="Dateien können nicht verschoben werden. Vorheriger Pfad wurde wiederhergestellt." name="okignore" yestext="OK"/>
|
||||||
</notification>
|
</notification>
|
||||||
|
<notification name="PreferenceQualityWithLowMemory">
|
||||||
|
Ihr System besitzt [TOTAL_MEM]MB Speicher. Dieser ist eventuell nicht ausreichend, um den Viewer auf höheren Einstellungen zu betreiben und kann zu Problemen führen.
|
||||||
|
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Fortsetzen"/>
|
||||||
|
</notification>
|
||||||
<notification name="DefaultObjectPermissions">
|
<notification name="DefaultObjectPermissions">
|
||||||
Problem beim Speichern der standardmäßigen Objektberechtigungen: [REASON]. Versuchen Sie später, die Standardberechtigungen einzustellen.
|
Problem beim Speichern der standardmäßigen Objektberechtigungen: [REASON]. Versuchen Sie später, die Standardberechtigungen einzustellen.
|
||||||
<usetemplate name="okbutton" yestext="OK"/>
|
<usetemplate name="okbutton" yestext="OK"/>
|
||||||
|
|
|
||||||
|
|
@ -13469,6 +13469,17 @@ They can use http://opensimulator.org/wiki/inventory to fix the issues.
|
||||||
yestext="OK"/>
|
yestext="OK"/>
|
||||||
</notification>
|
</notification>
|
||||||
|
|
||||||
|
<notification
|
||||||
|
icon="alertmodal.tga"
|
||||||
|
name="PreferenceQualityWithLowMemory"
|
||||||
|
type="alert">
|
||||||
|
Your system has [TOTAL_MEM]MB of memory, which might not be enough to run viewer at higher settings and might result in issues.
|
||||||
|
<usetemplate
|
||||||
|
name="okcancelbuttons"
|
||||||
|
notext="Cancel"
|
||||||
|
yestext="Continue"/>
|
||||||
|
</notification>
|
||||||
|
|
||||||
<notification
|
<notification
|
||||||
icon="alertmodal.tga"
|
icon="alertmodal.tga"
|
||||||
name="DefaultObjectPermissions"
|
name="DefaultObjectPermissions"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue