From c7f690e3b026ff2053a637b18b2718c44bae74a2 Mon Sep 17 00:00:00 2001
From: Cosmic Linden <cosmic@lindenlab.com>
Date: Fri, 16 Feb 2024 09:49:45 -0800
Subject: [PATCH] secondlife/viewer-issues#72: Material preview shouldRender
 should return false if no render needed

---
 indra/newview/lldynamictexture.cpp         |  2 ++
 indra/newview/llgltfmaterialpreviewmgr.cpp | 20 +++++++++++++++++++-
 indra/newview/llgltfmaterialpreviewmgr.h   |  8 ++------
 3 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index f8e50dd8570..425132ed34b 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -118,6 +118,8 @@ BOOL LLViewerDynamicTexture::render()
 //-----------------------------------------------------------------------------
 void LLViewerDynamicTexture::preRender(BOOL clear_depth)
 {
+    LL_PROFILE_ZONE_SCOPED_CATEGORY_UI;
+
      //use the bottom left corner
 	mOrigin.set(0, 0);
 
diff --git a/indra/newview/llgltfmaterialpreviewmgr.cpp b/indra/newview/llgltfmaterialpreviewmgr.cpp
index 35cc370e838..e472c06574c 100644
--- a/indra/newview/llgltfmaterialpreviewmgr.cpp
+++ b/indra/newview/llgltfmaterialpreviewmgr.cpp
@@ -58,6 +58,15 @@ LLGLTFPreviewTexture::MaterialLoadLevels::MaterialLoadLevels()
     }
 }
 
+bool LLGLTFPreviewTexture::MaterialLoadLevels::isFullyLoaded()
+{
+    for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+    {
+        if (levels[i] != FULLY_LOADED) { return false; }
+    }
+    return true;
+}
+
 S32& LLGLTFPreviewTexture::MaterialLoadLevels::operator[](size_t i)
 {
     llassert(i >= 0 && i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT);
@@ -185,17 +194,26 @@ LLPointer<LLGLTFPreviewTexture> LLGLTFPreviewTexture::create(LLPointer<LLFetched
     return new LLGLTFPreviewTexture(material, LLPipeline::MAX_BAKE_WIDTH);
 }
 
-void LLGLTFPreviewTexture::preRender(BOOL clear_depth)
+BOOL LLGLTFPreviewTexture::needsRender()
 {
     LL_PROFILE_ZONE_SCOPED_CATEGORY_UI;
 
+    if (!mShouldRender && mBestLoad.isFullyLoaded()) { return false; }
     MaterialLoadLevels current_load = get_material_load_levels(*mGLTFMaterial.get());
     if (current_load < mBestLoad)
     {
         mShouldRender = true;
         mBestLoad = current_load;
+        return true;
     }
+    return false;
+}
+
+void LLGLTFPreviewTexture::preRender(BOOL clear_depth)
+{
+    LL_PROFILE_ZONE_SCOPED_CATEGORY_UI;
 
+    llassert(mShouldRender);
     if (!mShouldRender) { return; }
 
     LLViewerDynamicTexture::preRender(clear_depth);
diff --git a/indra/newview/llgltfmaterialpreviewmgr.h b/indra/newview/llgltfmaterialpreviewmgr.h
index cc40a6f2e2a..981c8b05922 100644
--- a/indra/newview/llgltfmaterialpreviewmgr.h
+++ b/indra/newview/llgltfmaterialpreviewmgr.h
@@ -40,7 +40,7 @@ class LLGLTFPreviewTexture : public LLViewerDynamicTexture
     // Width scales with size of material's textures
     static LLPointer<LLGLTFPreviewTexture> create(LLPointer<LLFetchedGLTFMaterial> material);
 
-    BOOL needsRender() override { return mNeedsRender; }
+    BOOL needsRender() override;
     void preRender(BOOL clear_depth = TRUE) override;
     BOOL render() override;
     void postRender(BOOL success) override;
@@ -50,15 +50,12 @@ class LLGLTFPreviewTexture : public LLViewerDynamicTexture
         S32 levels[LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT];
 
         MaterialLoadLevels();
-
+        bool isFullyLoaded();
         S32& operator[](size_t i);
-
         const S32& operator[](size_t i) const;
-
         // Less is better
         // Returns false if lhs is not strictly less or equal for all levels
         bool operator<(const MaterialLoadLevels& other) const;
-
         // Less is better
         // Returns false if lhs is not strictly greater or equal for all levels
         bool operator>(const MaterialLoadLevels& other) const;
@@ -66,7 +63,6 @@ class LLGLTFPreviewTexture : public LLViewerDynamicTexture
 
 private:
     LLPointer<LLFetchedGLTFMaterial> mGLTFMaterial;
-    bool mNeedsRender = true;
     bool mShouldRender = true;
     MaterialLoadLevels mBestLoad;
 };
-- 
GitLab