summaryrefslogtreecommitdiff
path: root/indra/newview/llviewercontrol.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llviewercontrol.cpp')
-rw-r--r--indra/newview/llviewercontrol.cpp59
1 files changed, 58 insertions, 1 deletions
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 6d825441ca..772e1aeef9 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -112,6 +112,63 @@ static bool handleRenderAvatarMouselookChanged(const LLSD& newvalue)
return true;
}
+// Per-tier texture quality preset. Data-driven so adding a setting is
+// "add a column", and the tier values are visible side-by-side. Index is
+// RenderTextureQuality: 0=Low, 1=Medium, 2=High, 3=Ultra.
+namespace
+{
+ struct TexturePreset
+ {
+ const char* name;
+ U32 max_resolution;
+ F32 pixel_to_texel_ratio; // TexturePixelToTexelRatio (R_max, texels per pixel)
+ F32 pressure_tighten_rate; // TexturePressureTightenRate (ratio units/sec)
+ F32 pressure_relax_rate; // TexturePressureRelaxRate (ratio units/sec)
+ F32 channel_ratio_normal; // TextureChannelRatioNormal
+ F32 channel_ratio_basecolor; // TextureChannelRatioBaseColor
+ F32 channel_ratio_specular; // TextureChannelRatioSpecular
+ F32 channel_ratio_emissive; // TextureChannelRatioEmissive
+ };
+
+ // Tier values: Low (2-4GB), Medium (4-8GB), High (8-16GB), Ultra (16+GB).
+ // Quality ladder, expressed in pixel:texel (texels per pixel):
+ // - pixel_to_texel_ratio is the baseline quality: how many texels per
+ // screen pixel the tier allocates when VRAM is comfortable (1.0 = 1:1).
+ // Under pressure the runtime drives the global ratio below this with no
+ // floor (down to 0 = deepest mips), so there is no per-tier minimum.
+ // - the channel ratios coarsen specular/emissive/normal relative to base
+ // color (each is a multiplier on the global ratio).
+ // The pressure water marks (TexturePressureHighWater/LowWater) are NOT tiered - they're a
+ // physical "crossed the budget" threshold (0.90 / 0.70), constant across
+ // tiers. Lower tiers start blurrier (lower R_max) and tighten faster.
+ // max_res Rmax tight relax N BC S E
+ static constexpr TexturePreset TEXTURE_PRESETS[4] = {
+ /* 0 Low */ { "Low", 1024, 0.10f, 0.50f, 0.05f, 0.50f, 1.00f, 0.25f, 0.25f },
+ /* 1 Medium */ { "Medium", 2048, 0.40f, 0.35f, 0.08f, 1.00f, 1.00f, 0.50f, 0.50f },
+ /* 2 High */ { "High", 2048, 0.80f, 0.25f, 0.10f, 1.00f, 1.00f, 0.50f, 1.00f },
+ /* 3 Ultra */ { "Ultra", 2048, 1.00f, 0.15f, 0.12f, 1.00f, 1.00f, 1.00f, 1.00f },
+ };
+}
+
+static bool handleRenderTextureQualityChanged(const LLSD& newvalue)
+{
+ U32 quality = (U32)newvalue.asInteger();
+ if (quality > 3) quality = 3;
+ const TexturePreset& p = TEXTURE_PRESETS[quality];
+
+ gSavedSettings.setU32("RenderMaxTextureResolution", p.max_resolution);
+ gSavedSettings.setF32("TexturePixelToTexelRatio", p.pixel_to_texel_ratio);
+ gSavedSettings.setF32("TexturePressureTightenRate", p.pressure_tighten_rate);
+ gSavedSettings.setF32("TexturePressureRelaxRate", p.pressure_relax_rate);
+ gSavedSettings.setF32("TextureChannelRatioNormal", p.channel_ratio_normal);
+ gSavedSettings.setF32("TextureChannelRatioBaseColor", p.channel_ratio_basecolor);
+ gSavedSettings.setF32("TextureChannelRatioSpecular", p.channel_ratio_specular);
+ gSavedSettings.setF32("TextureChannelRatioEmissive", p.channel_ratio_emissive);
+
+ LL_INFOS("TextureStream") << "Applied texture quality preset: " << p.name << LL_ENDL;
+ return true;
+}
+
static bool handleRenderFarClipChanged(const LLSD& newvalue)
{
if (LLStartUp::getStartupState() >= STATE_STARTED)
@@ -816,6 +873,7 @@ void settings_setup_listeners()
{
LL_PROFILE_ZONE_SCOPED;
setting_setup_signal_listener(gSavedSettings, "FirstPersonAvatarVisible", handleRenderAvatarMouselookChanged);
+ setting_setup_signal_listener(gSavedSettings, "RenderTextureQuality", handleRenderTextureQualityChanged);
setting_setup_signal_listener(gSavedSettings, "RenderFarClip", handleRenderFarClipChanged);
setting_setup_signal_listener(gSavedSettings, "RenderTerrainScale", handleTerrainScaleChanged);
setting_setup_signal_listener(gSavedSettings, "RenderTerrainPBRScale", handlePBRTerrainScaleChanged);
@@ -827,7 +885,6 @@ void settings_setup_listeners()
setting_setup_signal_listener(gSavedSettings, "OctreeMaxNodeCapacity", handleRepartition);
setting_setup_signal_listener(gSavedSettings, "OctreeAlphaDistanceFactor", handleRepartition);
setting_setup_signal_listener(gSavedSettings, "OctreeAttachmentSizeFactor", handleRepartition);
- setting_setup_signal_listener(gSavedSettings, "RenderMaxTextureIndex", handleSetShaderChanged);
setting_setup_signal_listener(gSavedSettings, "RenderUIBuffer", handleWindowResized);
setting_setup_signal_listener(gSavedSettings, "RenderDepthOfField", handleReleaseGLBufferChanged);
setting_setup_signal_listener(gSavedSettings, "RenderFSAAType", handleReleaseGLBufferChanged);