From da29210ed601f2736ca36d3657cd7b1b463b3a9b Mon Sep 17 00:00:00 2001
From: Xiaohong Bao <bao@lindenlab.com>
Date: Tue, 1 May 2012 21:29:19 -0600
Subject: [PATCH] fix a sculpt crash

---
 indra/llrender/llimagegl.cpp      | 17 ++++++++++++++---
 indra/llrender/llimagegl.h        |  1 +
 indra/newview/llviewertexture.cpp |  5 +++++
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index bd9953e4182..2c13fead979 100755
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -1464,13 +1464,24 @@ void LLImageGL::destroyGLTexture()
 		}
 		
 		LLImageGL::deleteTextures(1, &mTexName);			
+		mCurrentDiscardLevel = -1 ; //invalidate mCurrentDiscardLevel.
 		mTexName = 0;		
 		mGLTextureCreated = FALSE ;
-	}
-	mCurrentDiscardLevel = -1 ; //invalidate mCurrentDiscardLevel.
+	}	
 }
 
-
+//force to invalidate the gl texture, most likely a sculpty texture
+void LLImageGL::forceToInvalidateGLTexture()
+{
+	if (mTexName != 0)
+	{
+		destroyGLTexture();
+	}
+	else
+	{
+		mCurrentDiscardLevel = -1 ; //invalidate mCurrentDiscardLevel.
+	}
+}
 
 //----------------------------------------------------------------------------
 
diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h
index 2060be914bc..e515d6b324a 100755
--- a/indra/llrender/llimagegl.h
+++ b/indra/llrender/llimagegl.h
@@ -114,6 +114,7 @@ class LLImageGL : public LLRefCount
 	// Read back a raw image for this discard level, if it exists
 	BOOL readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok) const;
 	void destroyGLTexture();
+	void forceToInvalidateGLTexture();
 
 	void setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format = 0, BOOL swap_bytes = FALSE);
 	void setComponents(S8 ncomponents) { mComponents = ncomponents; }
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index d83a5952202..ea329f6aace 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -2156,6 +2156,11 @@ void LLViewerFetchedTexture::clearFetchedResults()
 	
 	cleanup();
 	destroyGLTexture();
+
+	if(getDiscardLevel() >= 0) //sculpty texture, force to invalidate
+	{
+		mGLTexturep->forceToInvalidateGLTexture();
+	}
 }
 
 void LLViewerFetchedTexture::forceToDeleteRequest()
-- 
GitLab