summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2024-05-06 22:48:24 +0300
committerAndrey Kleshchev <117672381+akleshchev@users.noreply.github.com>2024-05-07 08:25:13 +0300
commitea268fcd48550f98baceef0294fd977ff12d2b35 (patch)
treee9c27493a8b1d6e20b31cb591b0074238470b2e5 /indra
parent7d87e41bbd5d4761b1eb17e49b7a00b948d84213 (diff)
viewer#799 getAvailableVRAMMegabytes cleanup
Diffstat (limited to 'indra')
-rw-r--r--indra/llwindow/llwindow.h2
-rw-r--r--indra/llwindow/llwindowheadless.h1
-rw-r--r--indra/llwindow/llwindowmacosx.cpp16
-rw-r--r--indra/llwindow/llwindowmacosx.h5
-rw-r--r--indra/llwindow/llwindowwin32.cpp97
-rw-r--r--indra/llwindow/llwindowwin32.h1
-rw-r--r--indra/newview/llfloaterlagmeter.cpp4
-rw-r--r--indra/newview/lltextureview.cpp5
-rw-r--r--indra/newview/llviewertexture.cpp52
-rw-r--r--indra/newview/llviewertexture.h4
10 files changed, 5 insertions, 182 deletions
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 1c41c1f627..396daec527 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -164,8 +164,6 @@ public:
virtual F32 getPixelAspectRatio() = 0;
virtual void setNativeAspectRatio(F32 aspect) = 0;
- // query VRAM usage
- virtual U32 getAvailableVRAMMegabytes() = 0;
virtual void setMaxVRAMMegabytes(U32 max_vram) = 0;
virtual void beforeDialog() {}; // prepare to put up an OS dialog (if special measures are required, such as in fullscreen mode)
diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h
index 06e6b2783d..f422152ab2 100644
--- a/indra/llwindow/llwindowheadless.h
+++ b/indra/llwindow/llwindowheadless.h
@@ -101,7 +101,6 @@ public:
/*virtual*/ F32 getPixelAspectRatio() override { return 1.0f; }
/*virtual*/ void setNativeAspectRatio(F32 ratio) override {}
- U32 getAvailableVRAMMegabytes() override { return 4096; }
void setMaxVRAMMegabytes(U32 max_vram) override {}
/*virtual*/ void *getPlatformWindow() override { return 0; }
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index bfa893fff8..73230805b4 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -118,7 +118,6 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
U32 fsaa_samples,
U32 max_vram)
: LLWindow(NULL, fullscreen, flags)
- , mMaxVRAM(max_vram)
{
// *HACK: During window construction we get lots of OS events for window
// reshape, activate, etc. that the viewer isn't ready to handle.
@@ -1255,21 +1254,6 @@ F32 LLWindowMacOSX::getPixelAspectRatio()
return 1.f;
}
-U32 LLWindowMacOSX::getAvailableVRAMMegabytes() {
- // MTL (and MoltenVK) has some additional gpu data, such as recommendedMaxWorkingSetSize and currentAllocatedSize.
- // But these are not available for OpenGL and/or our current mimimum OS version.
- // So we will estimate.
- static const U32 mb = 1024*1024;
- // We're asked for total available gpu memory, but we only have allocation info on texture usage. So estimate by doubling that.
- static const U32 total_factor = 2; // estimated total/textures
- U32 total_vram = gGLManager.mVRAM;
- if (mMaxVRAM)
- {
- total_vram = llmin(mMaxVRAM, total_vram);
- }
- return total_vram - (LLImageGL::getTextureBytesAllocated() * total_factor/mb);
-}
-
//static SInt32 oldWindowLevel;
// MBW -- XXX -- There's got to be a better way than this. Find it, please...
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 7b0695bc79..0d675671a9 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -100,9 +100,7 @@ public:
F32 getPixelAspectRatio() override;
void setNativeAspectRatio(F32 ratio) override { mOverrideAspectRatio = ratio; }
- // query VRAM usage
- /*virtual*/ U32 getAvailableVRAMMegabytes() override;
- virtual void setMaxVRAMMegabytes(U32 max_vram) override { mMaxVRAM = max_vram; }
+ virtual void setMaxVRAMMegabytes(U32 max_vram) override {}
void beforeDialog() override;
void afterDialog() override;
@@ -226,7 +224,6 @@ protected:
bool mMinimized;
U32 mFSAASamples;
bool mForceRebuild;
- U32 mMaxVRAM;
S32 mDragOverrideCursor;
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 1ed801a85a..24a7b5709b 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -370,14 +370,6 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
//clean up DXGI/D3D resources
void cleanupDX();
- // call periodically to update available VRAM
- void updateVRAMUsage();
-
- U32 getAvailableVRAMMegabytes()
- {
- return mAvailableVRAM;
- }
-
/// called by main thread to post work to this window thread
template <typename CALLABLE>
void post(CALLABLE&& func)
@@ -425,8 +417,6 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
// *HACK: Attempt to prevent startup crashes by deferring memory accounting
// until after some graphics setup. See SL-20177. -Cosmic,2023-09-18
bool mGLReady = false;
- // best guess at available video memory in MB
- std::atomic<U32> mAvailableVRAM;
U32 mMaxVRAM = 0; // maximum amount of vram to allow in the "budget", or 0 for no maximum (see updateVRAMUsage)
@@ -4556,11 +4546,6 @@ std::vector<std::string> LLWindowWin32::getDynamicFallbackFontList()
return std::vector<std::string>();
}
-U32 LLWindowWin32::getAvailableVRAMMegabytes()
-{
- return mWindowThread ? mWindowThread->getAvailableVRAMMegabytes() : 0;
-}
-
void LLWindowWin32::setMaxVRAMMegabytes(U32 max_vram)
{
if (mWindowThread)
@@ -4787,79 +4772,6 @@ void LLWindowWin32::LLWindowWin32Thread::cleanupDX()
}
}
-void LLWindowWin32::LLWindowWin32Thread::updateVRAMUsage()
-{
- LL_PROFILE_ZONE_SCOPED;
- if (!mGLReady) { return; }
-
- if (mDXGIAdapter != nullptr)
- {
- // NOTE: what lies below is hand wavy math based on compatibility testing and observation against a variety of hardware
- // It doesn't make sense, but please don't refactor it to make sense. -- davep
-
- DXGI_QUERY_VIDEO_MEMORY_INFO info;
- mDXGIAdapter->QueryVideoMemoryInfo(0, DXGI_MEMORY_SEGMENT_GROUP_LOCAL, &info);
-#if 0 // debug 0 budget and 0 CU
- info.Budget = 0;
- info.CurrentUsage = 0;
-#endif
-
- U32 budget_mb = info.Budget / 1024 / 1024;
- gGLManager.mVRAM = llmax(gGLManager.mVRAM, (S32) budget_mb);
-
- U32 afr_mb = info.AvailableForReservation / 1024 / 1024;
- // correct for systems that misreport budget
- if (budget_mb == 0)
- {
- // fall back to available for reservation clamped between 512MB and 2GB
- budget_mb = llclamp(afr_mb, (U32) 512, (U32) 2048);
- }
-
- if ( mMaxVRAM != 0)
- {
- budget_mb = llmin(budget_mb, mMaxVRAM);
- }
-
- U32 cu_mb = info.CurrentUsage / 1024 / 1024;
-
- // get an estimated usage based on texture bytes allocated
- U32 eu_mb = LLImageGL::getTextureBytesAllocated() * 2 / 1024 / 1024;
-
- if (cu_mb == 0)
- { // current usage is sometimes unreliable on Intel GPUs, fall back to estimated usage
- cu_mb = llmax((U32)1, eu_mb);
- }
- U32 target_mb = budget_mb;
-
- if (target_mb > 4096) // if 4GB are installed, try to leave 2GB free
- {
- target_mb -= 2048;
- }
- else // if less than 4GB are installed, try not to use more than half of it
- {
- target_mb /= 2;
- }
-
- mAvailableVRAM = cu_mb < target_mb ? target_mb - cu_mb : 0;
-
-#if 0
-
- F32 eu_error = (F32)((S32)eu_mb - (S32)cu_mb) / (F32)cu_mb;
- LL_INFOS("Window") << "\nLocal\nAFR: " << info.AvailableForReservation / 1024 / 1024
- << "\nBudget: " << info.Budget / 1024 / 1024
- << "\nCR: " << info.CurrentReservation / 1024 / 1024
- << "\nCU: " << info.CurrentUsage / 1024 / 1024
- << "\nEU: " << eu_mb << llformat(" (%.2f)", eu_error)
- << "\nTU: " << target_mb
- << "\nAM: " << mAvailableVRAM << LL_ENDL;
-#endif
- }
- else if (mD3DDevice != NULL)
- { // fallback to D3D9
- mAvailableVRAM = mD3DDevice->GetAvailableTextureMem() / 1024 / 1024;
- }
-}
-
void LLWindowWin32::LLWindowWin32Thread::run()
{
sWindowThreadId = std::this_thread::get_id();
@@ -4917,14 +4829,7 @@ void LLWindowWin32::LLWindowWin32Thread::run()
//process any pending functions
getQueue().runPending();
}
-
- // update available vram once every 3 seconds
- static LLFrameTimer vramTimer;
- if (vramTimer.getElapsedTimeF32() > 3.f)
- {
- updateVRAMUsage();
- vramTimer.reset();
- }
+
#if 0
{
LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("w32t - Sleep");
diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h
index 8b82ad92d5..7e320053a6 100644
--- a/indra/llwindow/llwindowwin32.h
+++ b/indra/llwindow/llwindowwin32.h
@@ -108,7 +108,6 @@ public:
/*virtual*/ F32 getPixelAspectRatio();
/*virtual*/ void setNativeAspectRatio(F32 ratio) { mOverrideAspectRatio = ratio; }
- U32 getAvailableVRAMMegabytes() override;
/*virtual*/ void setMaxVRAMMegabytes(U32 max_vram) override;
/*virtual*/ bool dialogColorPicker(F32 *r, F32 *g, F32 *b );
diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp
index 1cd46cdd44..c258da6640 100644
--- a/indra/newview/llfloaterlagmeter.cpp
+++ b/indra/newview/llfloaterlagmeter.cpp
@@ -179,10 +179,6 @@ void LLFloaterLagMeter::determineClient()
{
mClientCause->setText( getString("client_texture_loading_cause_msg", mStringArgs) );
}
- else if(LLViewerTexture::isMemoryForTextureLow())
- {
- mClientCause->setText( getString("client_texture_memory_cause_msg", mStringArgs) );
- }
else
{
mClientCause->setText( getString("client_complex_objects_cause_msg", mStringArgs) );
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index f410217387..e1779ba976 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -529,12 +529,11 @@ 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 Free: %d MB Sys Free: %d MB FBO: %d MB Bias: %.2f(%d MB) Cache: %.1f/%.1f MB",
- gViewerWindow->getWindow()->getAvailableVRAMMegabytes(),
+ text = llformat("Est. Free: %d MB Sys Free: %d MB FBO: %d MB Bias: %.2f Cache: %.1f/%.1f MB",
+ (S32)LLViewerTexture::sFreeVRAMMegabytes,
LLMemory::getAvailableMemKB()/1024,
LLRenderTarget::sBytesAllocated/(1024*1024),
discard_bias,
- (S32)LLViewerTexture::sFreeVRAMMegabytes,
cache_usage,
cache_max_usage);
//, cache_entries, cache_max_entries
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 4b94fe141c..dee68b2068 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1,3 +1,4 @@
+
/**
* @file llviewertexture.cpp
* @brief Object which handles a received image (and associated texture(s))
@@ -471,61 +472,10 @@ void LLViewerTexture::initClass()
LLImageGL::sDefaultGLTexture = LLViewerFetchedTexture::sDefaultImagep->getGLTexture();
}
-// tuning params
-const F32 GPU_MEMORY_CHECK_WAIT_TIME = 1.0f;
// non-const (used externally
F32 texmem_lower_bound_scale = 0.85f;
F32 texmem_middle_bound_scale = 0.925f;
-//static
-bool LLViewerTexture::isMemoryForTextureLow()
-{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
- // Note: we need to figure out a better source for 'min' values,
- // what is free for low end at minimal settings is 'nothing left'
- // for higher end gpus at high settings.
- const S32Megabytes MIN_FREE_TEXTURE_MEMORY(20);
- const S32Megabytes MIN_FREE_MAIN_MEMORY(100);
-
- S32Megabytes gpu;
- S32Megabytes physical;
- getGPUMemoryForTextures(gpu, physical);
-
- return (gpu < MIN_FREE_TEXTURE_MEMORY); // || (physical < MIN_FREE_MAIN_MEMORY);
-}
-
-//static
-void LLViewerTexture::getGPUMemoryForTextures(S32Megabytes &gpu, S32Megabytes &physical)
-{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
- static LLFrameTimer timer;
-
- static S32Megabytes gpu_res = S32Megabytes(S32_MAX);
- static S32Megabytes physical_res = S32Megabytes(S32_MAX);
-
- if (timer.getElapsedTimeF32() < GPU_MEMORY_CHECK_WAIT_TIME) //call this once per second.
- {
- gpu = gpu_res;
- physical = physical_res;
- return;
- }
- timer.reset();
-
- {
- // For purposes of texture memory need to check both, actual free
- // memory and estimated free texture memory from bias calculations
- U32 free_memory = llmin(gViewerWindow->getWindow()->getAvailableVRAMMegabytes(), (U32)sFreeVRAMMegabytes);
- gpu_res = (S32Megabytes)free_memory;
-
- //check main memory, only works for windows and macos.
- LLMemory::updateMemoryInfo();
- physical_res = LLMemory::getAvailableMemKB();
-
- gpu = gpu_res;
- physical = physical_res;
- }
-}
-
//static
void LLViewerTexture::updateClass()
{
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index ffa072b7f6..16446ffe58 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -185,11 +185,7 @@ private:
friend class LLUIImageList;
virtual void switchToCachedImage();
-
- static void getGPUMemoryForTextures(S32Megabytes &gpu, S32Megabytes &physical);
-public:
- static bool isMemoryForTextureLow();
protected:
friend class LLViewerTextureList;
LLUUID mID;