summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTommyTheTerrible <81168766+TommyTheTerrible@users.noreply.github.com>2025-05-05 04:52:58 -0400
committerGitHub <noreply@github.com>2025-05-05 11:52:58 +0300
commit89512d44f82dcb9679067bb2303acc40b7b43951 (patch)
treefb7aebeaa5b5c019dca7d09516f0c0888336f475
parentac5d59b9392dbd107ff6e8ac05ab8a3cd48fd694 (diff)
updateImageDecodePriority - Avoid Long Face Loop (#4019, #4021)
* updateImageDecodePriority - Avoid Long Face Loop To avoid running a long loop on thousands of faces, some textures were being set to a BOOST level to avoid the updateImageDecodePriority function entirely but this was causing many of them to never be deleted over the course of a user's travels. Instead of relying on BOOST, this commit changes the logic of the texture channel loop such that the face loop will only run if the number of faces is below the threshold. To do this, we move the face_count incrementing outside of the face loop into the channel loop and increment it using the getNumFaces function instead. We then check the face_count against the maximum number of faces we want to check and if it exceeds the number we set the number of faces for the face loop to check down to zero. This avoids branch prediction misses and the long face loop issue. Later, if the face_count is above the threshold, we assign the virtual size to the maximum. I personally believe the max_faces_to_check should be lower than 1024, but I left that value in for continuity. I use 64 faces as my max on my compiled version of the viewer without any noticeable issues for memory use. * updateImageDecodePriority - Face Loop Increment Swap Looks like compilers like knowing the incrementing in the for loop information for optimizations and parallelization. Sorry for the tiny commit. * updateImageDecodePriority - Suggested Cleanup Remove trailing white-space. Co-authored-by: Andrey Lihatskiy <alihatskiy@productengine.com>
-rw-r--r--indra/newview/llviewertexturelist.cpp12
1 files changed, 7 insertions, 5 deletions
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 63d5a2d778..fb8e8e7bf3 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -911,6 +911,7 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
bool on_screen = false;
U32 face_count = 0;
+ U32 max_faces_to_check = 1024;
// get adjusted bias based on image resolution
LLImageGL* img = imagep->getGLTexture();
@@ -923,13 +924,15 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i)
{
- for (S32 fi = 0; fi < imagep->getNumFaces(i); ++fi)
+ face_count += imagep->getNumFaces(i);
+ S32 faces_to_check = (face_count > max_faces_to_check) ? 0 : imagep->getNumFaces(i);
+
+ for (S32 fi = 0; fi < faces_to_check; ++fi)
{
LLFace* face = (*(imagep->getFaceList(i)))[fi];
if (face && face->getViewerObject())
{
- ++face_count;
F32 radius;
F32 cos_angle_to_view_dir;
@@ -992,11 +995,10 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
}
}
- if (face_count > 1024)
+ if (face_count > max_faces_to_check)
{ // this texture is used in so many places we should just boost it and not bother checking its vsize
// this is especially important because the above is not time sliced and can hit multiple ms for a single texture
- imagep->setBoostLevel(LLViewerFetchedTexture::BOOST_HIGH);
- // Do we ever remove it? This also sets texture nodelete!
+ max_vsize = MAX_IMAGE_AREA;
}
if (imagep->getType() == LLViewerTexture::LOD_TEXTURE && imagep->getBoostLevel() == LLViewerTexture::BOOST_NONE)