diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 91d15d8f8f..c1c26be210 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -917,9 +917,11 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
F32 bias = llclamp(max_discard - 2.f, 1.f, LLViewerTexture::sDesiredDiscardBias);
// convert bias into a vsize scaler
- bias = (F32) llroundf(powf(4, bias - 1.f));
-
// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ //bias = (F32) llroundf(powf(4, bias - 1.f));
+ // Pre-divied the bias so you can just use multiiply in the loop
+ bias = (F32) 1.0f / llroundf(powf(4, bias - 1.f));
+
// Apply new rules to bias discard, there are now 2 bias, off-screen and on-screen.
// On-screen Bias
// Only applied to LOD Textures and one that have Discard > 1 (0, 1 protected)
@@ -934,11 +936,19 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
// user complaints.
// Store a seperate max on screen vsize without bias applied.
- F32 max_on_screen_vsize = 0.0f;
- F32 on_screen_value = 0.0f;
+ F32 max_on_screen_vsize = 0.0f;
F32 importance_to_camera = 0.0f;
+ S32 on_screen_count = 0;
+ // Moved all the variables outside of the loop
+ bool current_on_screen = false;
+ F32 radius; // Moved outside the loop to save reallocation every loop
+ F32 cos_angle_to_view_dir; // Moved outside the loop to save reallocation every loop
+ F32 vsize = 0.0f; // Moved outside the loop to save reallocation every loop
+ F32 important_to_camera = 0.0f;
// [FIRE-35081]
-
+ // boost resolution of textures that are important to the camera
+ // Can instead of using max for a min of 1.0, just subtract 1 from the boost and just do a 1 + (TextureCameraBoost - 1) * importanceToCamera)
+ static LLCachedControl texture_camera_boost(gSavedSettings, "TextureCameraBoost", 7.f);
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i)
{
@@ -949,8 +959,11 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
if (face && face->getViewerObject())
{
++face_count;
- F32 radius;
- F32 cos_angle_to_view_dir;
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ // Moved outside the loop to stop createing new memory every loop
+ //F32 radius;
+ //F32 cos_angle_to_view_dir;
+ // [FIRE-35081]
if ((gFrameCount - face->mLastTextureUpdate) > 10)
{ // only call calcPixelArea at most once every 10 frames for a given face
@@ -960,11 +973,15 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
face->mLastTextureUpdate = gFrameCount;
}
- F32 vsize = face->getPixelArea();
+
+ // Also moved allocation outside the loop
// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ //F32 vsize = face->getPixelArea();
//on_screen = face->mInFrustum;
- bool current_on_screen = face->mInFrustum; // Create a new var to store the current on screen status
- on_screen = face->mInFrustum ? true : on_screen; // As we want to keep track of if we have an on screen image perminatly as the last face dictates if it scales or not.
+ vsize = face->getPixelArea();
+ current_on_screen = face->mInFrustum; // Create a new var to store the current on screen status
+ on_screen_count += current_on_screen; // Count the number of on sceen faces instead of using brach
+ important_to_camera = face->mImportanceToCamera; // Store so we don't have to do 2 indirects later on
// [FIRE-35081]
// Scale desired texture resolution higher or lower depending on texture scale
@@ -998,40 +1015,29 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
max_vsize = llmax(max_vsize, vsize);
*/
- // Store the vsize before the bias is applied
- F32 on_screen_vsize = vsize;
- // As we calculate both with and with-out bias, by doing this, you can skip the if statement in the middle of
- // expensive loop
- vsize /= bias;
-
- // boost resolution of textures that are important to the camera
- static LLCachedControl texture_camera_boost(gSavedSettings, "TextureCameraBoost", 8.f);
- //vsize *= llmax(face->mImportanceToCamera * texture_camera_boost, 1.f);
// Use math to skip having to use a conditaional check
// Bools are stored as 0 false, 1 true, use to cheat
// Lerp instead of doing conditional input
- // If the image is import to the camera, even a little then make the on screen true
- on_screen = face->mImportanceToCamera > 0.0f ? true : on_screen; // This branching should be optimized away.
- importance_to_camera = llmax(face->mImportanceToCamera * texture_camera_boost, 1.f);
- on_screen_value = F32(current_on_screen);
-
- vsize = lerp(vsize, vsize * importance_to_camera, on_screen_value);
-
- // Apply the mImportanceToCamera to the on screen vsize
- // Bools are stored as 0 false, 1 true, use to cheat
- // Perform a LERP on the value between the on screen vsize and the importance * on screen vsize
- on_screen_vsize = lerp(on_screen_vsize, on_screen_vsize * importance_to_camera, on_screen_value);
-
- max_vsize = llmax(max_vsize, vsize);
- //
+ // If the image is import to the camera, even a little then make the on screen true
+ on_screen_count += S32(important_to_camera * 1000.0f);
+ importance_to_camera = 1.0f + important_to_camera * texture_camera_boost;// llmax(important_to_camera * texture_camera_boost, 1.f);
+ vsize = vsize + (vsize * importance_to_camera - vsize) * F32(current_on_screen); //lerp(vsize, vsize * importance_to_camera, F32(current_on_screen));
+
// Update the max on screen vsize based upon the on screen vsize
- max_on_screen_vsize = llmax(max_on_screen_vsize, on_screen_vsize);
+ max_on_screen_vsize = llmax(max_on_screen_vsize, vsize);
+ max_vsize = llmax(max_vsize, vsize * bias);
// [FIRE-35081]
}
}
}
+ //
+ // Replaced all the checks for this bool to be only in this 1 place instead of in the loop.
+ // If the on screen counter is greater then 0, then there was at least 1 on screen texture
+ on_screen = bool(on_screen_count);
+ //
+
if (face_count > 1024)
{ // 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
@@ -1048,66 +1054,29 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
{
imagep->mMaxVirtualSize = 0.f;
}
- }
+ }
// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//imagep->addTextureStats(max_vsize);
- // Recaluclate the
- on_screen_value = F32(on_screen);
// New logic block for the bias system
- // Switch on the type of texture first
- switch(imagep->getType())
+ // Fetched Textures (Non LOD normal textures) Or LOD Textures with a discard level of 0 or 1 or have a Bias < 2.0
+ if (imagep->getType() == LLViewerTexture::FETCHED_TEXTURE || (imagep->getType() == LLViewerTexture::LOD_TEXTURE && (imagep->getDiscardLevel() < 2 || LLViewerTexture::sDesiredDiscardBias < 2.0f)))
{
- // All dynamic or local textures block
- case LLViewerTexture::DYNAMIC_TEXTURE:
- case LLViewerTexture::LOCAL_TEXTURE:
- case LLViewerTexture::MEDIA_TEXTURE:
- {
- // Only apply the max on screen virtual size to textures that should not be scaled
- imagep->addTextureStats(max_on_screen_vsize);
- break;
- }
-
- // Fetched Textures (Non LOD normal textures)
- case LLViewerTexture::FETCHED_TEXTURE:
- {
- // Only apply the bias when off screen, otherwise use the non bias caculated value
- imagep->addTextureStats(lerp(max_vsize, max_on_screen_vsize, on_screen_value));
- break;
- }
- // Handle the LOD texture
- case LLViewerTexture::LOD_TEXTURE:
- {
- // Switch on the get discard level
- switch(imagep->getDiscardLevel())
- {
- // We want the 2 best quality discards to always be good quality
- case 0:
- case 1:
- {
- // If the texture is really in screen, use the max on screen virtual size, otherwise the max virtual size (off-screen) use the Lerp to
- // instead of if statement
- imagep->addTextureStats(lerp(max_vsize, max_on_screen_vsize, on_screen_value));
- break;
- }
- // All other discard levels (2 to MAX_DISCARD_LEVEL)
- default:
- {
- // If the discard level is between 1 and 2
- if (LLViewerTexture::sDesiredDiscardBias >= 1.0f && LLViewerTexture::sDesiredDiscardBias < 2.0f)
- {
- // Only apply the bias when off screen, otherwise use the non bias caculated value
- imagep->addTextureStats(lerp(max_vsize, max_on_screen_vsize, on_screen_value));
- }
- else
- {
- // Apply the off screen texture max virtual size
- imagep->addTextureStats(max_vsize);
- }
- break;
- }
- }
- break;
- }
+ // Perform Lerp without function call
+ max_vsize = max_vsize + (max_on_screen_vsize - max_vsize) * F32(on_screen);
+ // Only apply the bias when off screen, otherwise use the non bias caculated value
+ imagep->addTextureStats(max_vsize);
+ }
+ // All other LOD texture textures
+ else if (imagep->getType() == LLViewerTexture::LOD_TEXTURE)
+ {
+ // Apply the off screen texture max virtual size
+ imagep->addTextureStats(max_vsize);
+ }
+ // All dynamic or local textures block
+ else
+ {
+ // Only apply the max on screen virtual size to textures that should not be scaled
+ imagep->addTextureStats(max_on_screen_vsize);
}
// [FIRE-35081]
}