summaryrefslogtreecommitdiff
path: root/indra/newview/llviewertexture.cpp
diff options
context:
space:
mode:
authorBrad Linden <brad@lindenlab.com>2024-09-04 12:51:24 -0700
committerBrad Linden <brad@lindenlab.com>2024-09-04 12:51:24 -0700
commit49abe2c8bc23e306d304d02704e2b883648baea6 (patch)
treebb07d3fce7de85e22c4f59abff2ea65d031fcd69 /indra/newview/llviewertexture.cpp
parentc2724537adab9d31c23d33e36002772a9c56f4c3 (diff)
parentd5446b3bcd34ad63b1d120f34c2a4d234262fd38 (diff)
Merge remote-tracking branch 'origin/release/2024.08-DeltaFPS' into develop
Diffstat (limited to 'indra/newview/llviewertexture.cpp')
-rw-r--r--indra/newview/llviewertexture.cpp48
1 files changed, 28 insertions, 20 deletions
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index bb16fec32a..d16656abfc 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -511,12 +511,33 @@ void LLViewerTexture::updateClass()
F32 over_pct = (used - target) / target;
- bool is_low = over_pct > 0.f;
+ bool is_sys_low = isSystemMemoryLow();
+ bool is_low = is_sys_low || over_pct > 0.f;
- if (isSystemMemoryLow())
+ static bool was_low = false;
+ static bool was_sys_low = false;
+
+ if (is_low && !was_low)
+ {
+ // slam to 1.5 bias the moment we hit low memory (discards off screen textures immediately)
+ sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f);
+
+ if (is_sys_low)
+ { // if we're low on system memory, emergency purge off screen textures to avoid a death spiral
+ LL_WARNS() << "Low system memory detected, emergency downrezzing off screen textures" << LL_ENDL;
+ for (auto& image : gTextureList)
+ {
+ gTextureList.updateImageDecodePriority(image, false /*will modify gTextureList otherwise!*/);
+ }
+ }
+ }
+
+ was_low = is_low;
+ was_sys_low = is_sys_low;
+
+ if (is_low)
{
- is_low = true;
- // System RAM is low -> ramp up discard bias over time to free memory
+ // ramp up discard bias over time to free memory
if (sEvaluationTimer.getElapsedTimeF32() > MEMORY_CHECK_WAIT_TIME)
{
static LLCachedControl<F32> low_mem_min_discard_increment(gSavedSettings, "RenderLowMemMinDiscardIncrement", .1f);
@@ -526,29 +547,16 @@ void LLViewerTexture::updateClass()
}
else
{
- sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.f + over_pct);
+ // don't execute above until the slam to 1.5 has a chance to take effect
+ sEvaluationTimer.reset();
+ // lower discard bias over time when free memory is available
if (sDesiredDiscardBias > 1.f && over_pct < 0.f)
{
sDesiredDiscardBias -= gFrameIntervalSeconds * 0.01f;
}
}
- static bool was_low = false;
- if (is_low && !was_low)
- {
- LL_WARNS() << "Low system memory detected, emergency downrezzing off screen textures" << LL_ENDL;
- sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f);
-
- for (auto& image : gTextureList)
- {
- gTextureList.updateImageDecodePriority(image, false /*will modify gTextureList otherwise!*/);
- }
- }
-
- was_low = is_low;
-
-
// set to max discard bias if the window has been backgrounded for a while
static bool was_backgrounded = false;
static LLFrameTimer backgrounded_timer;