diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 4acf942617..95794bff13 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11177,13 +11177,13 @@ Change of this parameter will affect the layout of buttons in notification toast RenderMaxVRAMBudget Comment - Maximum amount of texture memory to budget for (in MB), or 0 for autodetect. + Maximum amount of texture memory to budget for (in MB), or autodetect if FSLimitTextureVRAMUsage is disabled. Persist 1 Type U32 Value - 0 + 768 RenderMinFreeMainMemoryThreshold @@ -23923,7 +23923,7 @@ Change of this parameter will affect the layout of buttons in notification toast HideFromEditor 1 Type - S32 + U32 Value 0 @@ -25975,5 +25975,16 @@ Change of this parameter will affect the layout of buttons in notification toast Value 1 + FSLimitTextureVRAMUsage + + Comment + If enabled, limits the amount of VRAM used for textures to the value of RenderMaxVRAMBudget. + Persist + 1 + Type + Boolean + Value + 0 + diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 7c24078e28..8eee700b5c 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1513,12 +1513,12 @@ bool LLAppViewer::init() void LLAppViewer::overrideDetectedHardware() { // Override the VRAM Detection if FSOverrideVRAMDetection is set. - if ( gSavedSettings.getBOOL("FSOverrideVRAMDetection") ) + if (gSavedSettings.getBOOL("FSOverrideVRAMDetection")) { - S32 forced_video_memory = gSavedSettings.getS32("FSForcedVideoMemory"); + U32 forced_video_memory = gSavedSettings.getU32("FSForcedVideoMemory"); // Note: 0 is allowed here, some systems detect VRAM as zero so override should support emulating them. - LL_INFOS("AppInit") << "Overriding VRAM to " << forced_video_memory*1024 << " MB" << LL_ENDL; - gGLManager.mVRAM = forced_video_memory*1024; + LL_INFOS("AppInit") << "Overriding VRAM to " << forced_video_memory * 1024U << " MB" << LL_ENDL; + gGLManager.mVRAM = forced_video_memory * 1024U; } } // @@ -4169,8 +4169,9 @@ LLSD LLAppViewer::getViewerInfo() const // // Include VRAM budget - if (auto budget = gSavedSettings.getU32("RenderMaxVRAMBudget"); budget > 0) + if (gSavedSettings.getBOOL("FSLimitTextureVRAMUsage")) { + auto budget = gSavedSettings.getU32("RenderMaxVRAMBudget"); info["VRAM_BUDGET"] = std::to_string(budget) + " MB"; info["VRAM_BUDGET_ENGLISH"] = std::to_string(budget) + " MB"; } diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index cf036eea49..d7d9770075 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -2238,6 +2238,12 @@ void LLFloaterPreference::refreshEnabledState() getChild("do_not_disturb_response")->setEnabled(!RlvActions::hasBehaviour(RLV_BHVR_SENDIM)); } // [/RLVa:KB] + + // Expose max texture VRAM setting + auto max_texmem = getChild("RenderMaxVRAMBudget"); + max_texmem->setMinValue(MIN_VRAM_BUDGET); + max_texmem->setMaxValue((F32)gGLManager.mVRAM); + // } // Support preferences search SLURLs diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 5345948db1..92db268c39 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -103,7 +103,7 @@ bool LLViewerTexture::sFreezeImageUpdates = false; F32 LLViewerTexture::sCurrentTime = 0.0f; constexpr F32 MEMORY_CHECK_WAIT_TIME = 1.0f; -constexpr F32 MIN_VRAM_BUDGET = 768.f; +//constexpr F32 MIN_VRAM_BUDGET = 768.f; // Expose max texture VRAM setting F32 LLViewerTexture::sFreeVRAMMegabytes = MIN_VRAM_BUDGET; LLViewerTexture::EDebugTexels LLViewerTexture::sDebugTexelsMode = LLViewerTexture::DEBUG_TEXELS_OFF; @@ -510,6 +510,7 @@ void LLViewerTexture::updateClass() LLViewerMediaTexture::updateClass(); static LLCachedControl max_vram_budget(gSavedSettings, "RenderMaxVRAMBudget", 0); + static LLCachedControl max_vram_budget_enabled(gSavedSettings, "FSLimitTextureVRAMUsage"); // Expose max texture VRAM setting F64 texture_bytes_alloc = LLImageGL::getTextureBytesAllocated() / 1024.0 / 512.0; F64 vertex_bytes_alloc = LLVertexBuffer::getBytesAllocated() / 1024.0 / 512.0; @@ -518,7 +519,9 @@ void LLViewerTexture::updateClass() // NOTE: our metrics miss about half the vram we use, so this biases high but turns out to typically be within 5% of the real number F32 used = (F32)ll_round(texture_bytes_alloc + vertex_bytes_alloc); - F32 budget = max_vram_budget == 0 ? (F32)gGLManager.mVRAM : (F32)max_vram_budget; + // Expose max texture VRAM setting + //F32 budget = max_vram_budget == 0 ? (F32)gGLManager.mVRAM : (F32)max_vram_budget; + F32 budget = !max_vram_budget_enabled ? (F32)gGLManager.mVRAM : (F32)max_vram_budget; // Try to leave at least half a GB for everyone else and for bias, // but keep at least 768MB for ourselves diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 771d7bbf5e..d2fd4733be 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -44,6 +44,7 @@ // Max texture resolution extern U32 DESIRED_NORMAL_TEXTURE_SIZE; +constexpr F32 MIN_VRAM_BUDGET = 768.f; // Expose max texture VRAM setting class LLFace; class LLImageGL ; diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml index 1f53590d9f..31514236e6 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml @@ -165,6 +165,8 @@ Erweiterte Einstellungen (Neustart erforderlich): + + diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 92112c34cc..393ae7f62a 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -1071,6 +1071,34 @@ value="2" /> + + +