From 33f0252993939674c43f63b3f6ab9da890300eb4 Mon Sep 17 00:00:00 2001 From: Rye Mutt <rye@alchemyviewer.org> Date: Sun, 5 Feb 2023 14:05:14 -0500 Subject: [PATCH] Allow 4gb of texture memory Includes changes from Ansariel Hiller --- indra/newview/lltextureview.cpp | 2 +- indra/newview/llviewertexture.cpp | 2 +- indra/newview/llviewertexturelist.cpp | 40 +++++++++++++++++++-------- indra/newview/llviewertexturelist.h | 4 +-- 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index b826a5b0b9a..456b4e40715 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -557,7 +557,7 @@ void LLGLTexMemBar::draw() U32 texFetchLatMed = U32(recording.getMean(LLTextureFetch::sTexFetchLatency).value() * 1000.0f); U32 texFetchLatMax = U32(recording.getMax(LLTextureFetch::sTexFetchLatency).value() * 1000.0f); - text = llformat("GL Tot: %d/%d MB GL Free: %d Sys Free: %d MB Bound: %4d/%4d MB FBO: %d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB", + text = llformat("GL Tot: %d/%d MB GL Free: %d MB Sys Free: %d MB Bound: %4d/%4d MB FBO: %d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB", total_mem.value(), max_total_mem.value(), LLImageGLThread::getFreeVRAMMegabytes(), diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 64e22841e45..bd18b997b46 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -64,7 +64,7 @@ // extern const S32Megabytes gMinVideoRam(32); #if defined(_WIN64) || defined(__amd64__) || defined(__x86_64__) -const S32Megabytes gMaxVideoRam(3072); +const S32Megabytes gMaxVideoRam(4096); #else const S32Megabytes gMaxVideoRam(512); #endif diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index dac8b65c5c5..7a3a905831f 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1406,7 +1406,7 @@ S32Megabytes LLViewerTextureList::getMinVideoRamSetting() //static // Returns max setting for TextureMemory (in MB) -S32Megabytes LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, float mem_multiplier) +S32Megabytes LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, float mem_multiplier, bool clamp_upper_limit /* = true */) { LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE; S32Megabytes max_texmem; @@ -1415,13 +1415,6 @@ S32Megabytes LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, fl // Treat any card with < 32 MB (shudder) as having 32 MB // - it's going to be swapping constantly regardless S32Megabytes max_vram(gGLManager.mVRAM); - - if(gGLManager.mIsAMD) - { - //shrink the availabe vram for ATI cards because some of them do not handel texture swapping well. - max_vram = max_vram * 0.75f; - } - max_vram = llmax(max_vram, getMinVideoRamSetting()); max_texmem = max_vram; if (!get_recommended) @@ -1453,7 +1446,14 @@ S32Megabytes LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, fl // limit the texture memory to a multiple of the default if we've found some cards to behave poorly otherwise max_texmem = llmin(max_texmem, (S32Megabytes) (mem_multiplier * max_texmem)); - max_texmem = llclamp(max_texmem, getMinVideoRamSetting(), gMaxVideoRam); + if (clamp_upper_limit) + { + max_texmem = llclamp(max_texmem, getMinVideoRamSetting(), gMaxVideoRam); + } + else + { + max_texmem = llmax(max_texmem, getMinVideoRamSetting()); + } return max_texmem; } @@ -1519,8 +1519,24 @@ void LLViewerTextureList::updateMaxResidentTexMem(S32Megabytes mem) // currently max(12MB, VRAM/4) assumed... S32Megabytes vb_mem = mem; - S32Megabytes fb_mem = llmax(VIDEO_CARD_FRAMEBUFFER_MEM, vb_mem/4); - mMaxResidentTexMemInMegaBytes = (vb_mem - fb_mem) ; //in MB + + S32Megabytes total_mem = getMaxVideoRamSetting(true, mem_multiplier, false); + + if ((vb_mem / 3) > VIDEO_CARD_FRAMEBUFFER_MEM) + { + vb_mem = vb_mem * 4 / 3; + } + else + { + vb_mem += VIDEO_CARD_FRAMEBUFFER_MEM; + } + + vb_mem = llmin (vb_mem, total_mem); + mMaxResidentTexMemInMegaBytes = vb_mem; //in MB + { + S32Megabytes fb_mem = llmax(VIDEO_CARD_FRAMEBUFFER_MEM, vb_mem/4); + mMaxResidentTexMemInMegaBytes -= fb_mem; //in MB + } #if defined(_WIN64) || defined(__amd64__) || defined(__x86_64__) if (mMaxResidentTexMemInMegaBytes > gMaxVideoRam / 2) @@ -1553,7 +1569,7 @@ void LLViewerTextureList::updateMaxResidentTexMem(S32Megabytes mem) } LL_INFOS() << "Total Video Memory set to: " << vb_mem << " MB" << LL_ENDL; - LL_INFOS() << "Available Texture Memory set to: " << (vb_mem - fb_mem) << " MB" << LL_ENDL; + LL_INFOS() << "Available Texture Memory set to: " << mMaxResidentTexMemInMegaBytes << " MB" << LL_ENDL; LL_INFOS() << "Total Texture Memory set to: " << mMaxTotalTextureMemInMegaBytes << " MB" << LL_ENDL; LL_INFOS() << "Maxiumum Resident Texture Memory set to: " << mMaxResidentTexMemInMegaBytes << " MB" << LL_ENDL; } diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index 966e17b0d91..6c3865f7549 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -155,7 +155,7 @@ class LLViewerTextureList void setDebugFetching(LLViewerFetchedTexture* tex, S32 debug_level); static S32Megabytes getMinVideoRamSetting(); - static S32Megabytes getMaxVideoRamSetting(bool get_recommended, float mem_multiplier); + static S32Megabytes getMaxVideoRamSetting(bool get_recommended, float mem_multiplier, bool clamp_upper_limit = true); static bool isPrioRequestsFetched(); @@ -290,7 +290,7 @@ class LLUIImageList final : public LLImageProviderInterface, public LLSingleton< LLRect mImageClipRegion; }; - typedef boost::unordered_flat_map< std::string, LLPointer<LLUIImage> > uuid_ui_image_map_t; + typedef boost::unordered_map< std::string, LLPointer<LLUIImage> > uuid_ui_image_map_t; uuid_ui_image_map_t mUIImages; // -- GitLab