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] }