From 503dc6ee656bdf579107ff9712ae8e960dd91100 Mon Sep 17 00:00:00 2001
From: ruslantproductengine <ruslantproductengine@lindenlab.com>
Date: Thu, 21 Apr 2016 12:47:49 +0300
Subject: [PATCH] MAINT-6317 [QuickGraphics-RC] Some rigged mesh attachments
 render fully on jellybaby avatars when ALM is enabled FIXED - remove global
 identifier for the black texture - add black texture 2x2x3 localy on
 apllication startup - add special flag to LLViewerFetchedTexture for protect
 from removing

---
 indra/llcommon/indra_constants.cpp    |  1 -
 indra/llcommon/indra_constants.h      |  2 --
 indra/newview/llappviewer.h           |  1 +
 indra/newview/lldrawpoolavatar.cpp    | 10 ++++------
 indra/newview/llviewertexture.cpp     |  1 +
 indra/newview/llviewertexture.h       |  6 +++++-
 indra/newview/llviewertexturelist.cpp |  8 +++++++-
 7 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/indra/llcommon/indra_constants.cpp b/indra/llcommon/indra_constants.cpp
index 1d094cd4f4..60721977cd 100644
--- a/indra/llcommon/indra_constants.cpp
+++ b/indra/llcommon/indra_constants.cpp
@@ -68,4 +68,3 @@ const LLUUID TERRAIN_ROCK_DETAIL		("53a2f406-4895-1d13-d541-d2e3b86bc19c"); // V
 
 const LLUUID DEFAULT_WATER_NORMAL		("822ded49-9a6c-f61c-cb89-6df54f42cdf4"); // VIEWER
 
-const LLUUID IMG_BLACK_SQUARE	        ("3b39cc01-c2d1-e194-1181-e4404978b20c"); // On dataserver
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index 6d39aef32e..02f063f5e8 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -205,8 +205,6 @@ LL_COMMON_API extern const LLUUID TERRAIN_ROCK_DETAIL;
 
 LL_COMMON_API extern const LLUUID DEFAULT_WATER_NORMAL;
 
-LL_COMMON_API extern const LLUUID IMG_BLACK_SQUARE;
-
 
 // radius within which a chat message is fully audible
 const F32 CHAT_NORMAL_RADIUS = 20.f;
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 539881c80e..b5e674bd7b 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -410,6 +410,7 @@ extern BOOL gPrintMessagesThisFrame;
 
 extern LLUUID gSunTextureID;
 extern LLUUID gMoonTextureID;
+extern LLUUID gBlackSquareID;
 
 extern BOOL gRandomizeFramerate;
 extern BOOL gPeriodicSlowFrame;
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index d4f37e51ef..f44e19dbe4 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -50,6 +50,7 @@
 #include "llrendersphere.h"
 #include "llviewerpartsim.h"
 #include "llviewercontrol.h" // for gSavedSettings
+#include "llviewertexturelist.h"
 
 static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK;
 static U32 sBufferUsage = GL_STREAM_DRAW_ARB;
@@ -63,6 +64,7 @@ BOOL	LLDrawPoolAvatar::sSkipTransparent = FALSE;
 S32 LLDrawPoolAvatar::sDiffuseChannel = 0;
 F32 LLDrawPoolAvatar::sMinimumAlpha = 0.2f;
 
+LLUUID gBlackSquareID;
 
 static bool is_deferred_render = false;
 static bool is_post_deferred_render = false;
@@ -1811,12 +1813,8 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
                 LLViewerTexture* specular = NULL;
                 if (LLPipeline::sImpostorRender)
                 {
-                    std::vector<LLViewerFetchedTexture*> found;
-                    LLViewerTextureManager::findFetchedTextures(IMG_BLACK_SQUARE, found);
-                    if (1 <= found.size())
-                    {
-                        specular = found[0];
-                    }
+                    specular = LLViewerTextureManager::findFetchedTexture(gBlackSquareID, TEX_LIST_DISCARD);
+                    llassert(NULL != specular);
                 }
                 else
                 {
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index e2b8ff8e80..5a38ab5c9d 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1117,6 +1117,7 @@ void LLViewerFetchedTexture::init(bool firstinit)
 	mLastCallBackActiveTime = 0.f;
 	mForceCallbackFetch = FALSE;
 	mInDebug = FALSE;
+	mUnremovable = FALSE;
 
 	mFTType = FTT_UNKNOWN;
 }
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index a3f8db6907..8017d82604 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -346,7 +346,10 @@ public:
 
 	bool updateFetch();
 	bool setDebugFetching(S32 debug_level);
-	bool isInDebug() {return mInDebug;}
+	bool isInDebug() const { return mInDebug; }
+
+	void setUnremovable(BOOL value) { mUnremovable = value; }
+	bool isUnremovable() const { return mUnremovable; }
 	
 	void clearFetchedResults(); //clear all fetched results, for debug use.
 
@@ -435,6 +438,7 @@ private:
 private:
 	BOOL  mFullyLoaded;
 	BOOL  mInDebug;
+	BOOL  mUnremovable;
 	BOOL  mInFastCacheList;
 	BOOL  mForceCallbackFetch;
 
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 9ee5ed758f..be80fab8d2 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -184,6 +184,12 @@ void LLViewerTextureList::doPreloadImages()
 		mImagePreloads.insert(image);
 	}
 	
+	LLPointer<LLImageRaw> img_blak_square_tex(new LLImageRaw(2, 2, 3));
+	memset(img_blak_square_tex->getData(), 0, img_blak_square_tex->getDataSize());
+	LLPointer<LLViewerFetchedTexture> img_blak_square(new LLViewerFetchedTexture(img_blak_square_tex, FTT_DEFAULT, FALSE));
+	gBlackSquareID = img_blak_square->getID();
+	img_blak_square->setUnremovable(TRUE);
+	addImage(img_blak_square, TEX_LIST_DISCARD);
 }
 
 static std::string get_texture_list_name()
@@ -854,7 +860,7 @@ void LLViewerTextureList::updateImagesDecodePriorities()
 			LLPointer<LLViewerFetchedTexture> imagep = iter->second;
 			++iter; // safe to increment now
 
-			if(imagep->isInDebug())
+			if(imagep->isInDebug() || imagep->isUnremovable())
 			{
 				update_counter--;
 				continue; //is in debug, ignore.
-- 
GitLab