Skip to content
Snippets Groups Projects
Commit e32d1cf7 authored by Xiaohong Bao's avatar Xiaohong Bao
Browse files

fix for STORM-973: [crashhunters] crash at...

fix for STORM-973: [crashhunters] crash at LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *)
parent 3c6a0937
No related branches found
No related tags found
No related merge requests found
...@@ -853,6 +853,11 @@ void LLBumpImageList::destroyGL() ...@@ -853,6 +853,11 @@ void LLBumpImageList::destroyGL()
void LLBumpImageList::restoreGL() void LLBumpImageList::restoreGL()
{ {
if(!gTextureList.isInitialized())
{
return ;
}
LLStandardBumpmap::restoreGL(); LLStandardBumpmap::restoreGL();
// Images will be recreated as they are needed. // Images will be recreated as they are needed.
} }
......
...@@ -76,18 +76,23 @@ LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE); ...@@ -76,18 +76,23 @@ LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE);
LLViewerTextureList gTextureList; LLViewerTextureList gTextureList;
static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images"); static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images");
U32 LLViewerTextureList::sRenderThreadID = 0 ;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
LLViewerTextureList::LLViewerTextureList() LLViewerTextureList::LLViewerTextureList()
: mForceResetTextureStats(FALSE), : mForceResetTextureStats(FALSE),
mUpdateStats(FALSE), mUpdateStats(FALSE),
mMaxResidentTexMemInMegaBytes(0), mMaxResidentTexMemInMegaBytes(0),
mMaxTotalTextureMemInMegaBytes(0) mMaxTotalTextureMemInMegaBytes(0),
mInitialized(FALSE)
{ {
} }
void LLViewerTextureList::init() void LLViewerTextureList::init()
{ {
sRenderThreadID = LLThread::currentID() ;
mInitialized = TRUE ;
sNumImages = 0; sNumImages = 0;
mMaxResidentTexMemInMegaBytes = 0; mMaxResidentTexMemInMegaBytes = 0;
mMaxTotalTextureMemInMegaBytes = 0 ; mMaxTotalTextureMemInMegaBytes = 0 ;
...@@ -110,6 +115,10 @@ void LLViewerTextureList::doPreloadImages() ...@@ -110,6 +115,10 @@ void LLViewerTextureList::doPreloadImages()
{ {
LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL; LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL;
llassert_always(mInitialized) ;
llassert_always(mImageList.empty()) ;
llassert_always(mUUIDMap.empty()) ;
// Set the "missing asset" image // Set the "missing asset" image
LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI); LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI);
...@@ -305,6 +314,7 @@ void LLViewerTextureList::destroyGL(BOOL save_state) ...@@ -305,6 +314,7 @@ void LLViewerTextureList::destroyGL(BOOL save_state)
void LLViewerTextureList::restoreGL() void LLViewerTextureList::restoreGL()
{ {
llassert_always(mInitialized) ;
LLImageGL::restoreGL(); LLImageGL::restoreGL();
} }
...@@ -489,8 +499,10 @@ LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id) ...@@ -489,8 +499,10 @@ LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id)
return iter->second; return iter->second;
} }
void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image) void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image, U32 thread_id)
{ {
llassert_always(mInitialized) ;
llassert_always(sRenderThreadID == thread_id);
llassert(image); llassert(image);
if (image->isInImageList()) if (image->isInImageList())
{ {
...@@ -504,8 +516,10 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image) ...@@ -504,8 +516,10 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
image->setInImageList(TRUE) ; image->setInImageList(TRUE) ;
} }
void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image) void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id)
{ {
llassert_always(mInitialized) ;
llassert_always(sRenderThreadID == thread_id);
llassert(image); llassert(image);
if (!image->isInImageList()) if (!image->isInImageList())
{ {
...@@ -702,9 +716,9 @@ void LLViewerTextureList::updateImagesDecodePriorities() ...@@ -702,9 +716,9 @@ void LLViewerTextureList::updateImagesDecodePriorities()
if ((decode_priority_test < old_priority_test * .8f) || if ((decode_priority_test < old_priority_test * .8f) ||
(decode_priority_test > old_priority_test * 1.25f)) (decode_priority_test > old_priority_test * 1.25f))
{ {
removeImageFromList(imagep); removeImageFromList(imagep, sRenderThreadID);
imagep->setDecodePriority(decode_priority); imagep->setDecodePriority(decode_priority);
addImageToList(imagep); addImageToList(imagep, sRenderThreadID);
} }
update_counter--; update_counter--;
} }
...@@ -781,9 +795,8 @@ void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep) ...@@ -781,9 +795,8 @@ void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep)
imagep->processTextureStats(); imagep->processTextureStats();
F32 decode_priority = LLViewerFetchedTexture::maxDecodePriority() ; F32 decode_priority = LLViewerFetchedTexture::maxDecodePriority() ;
imagep->setDecodePriority(decode_priority); imagep->setDecodePriority(decode_priority);
mImageList.insert(imagep); addImageToList(imagep);
imagep->setInImageList(TRUE) ;
return ; return ;
} }
...@@ -877,7 +890,9 @@ void LLViewerTextureList::decodeAllImages(F32 max_time) ...@@ -877,7 +890,9 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
{ {
LLTimer timer; LLTimer timer;
if(gNoRender) return; if(gNoRender) return;
llassert_always(sRenderThreadID == LLThread::currentID());
// Update texture stats and priorities // Update texture stats and priorities
std::vector<LLPointer<LLViewerFetchedTexture> > image_list; std::vector<LLPointer<LLViewerFetchedTexture> > image_list;
for (image_priority_list_t::iterator iter = mImageList.begin(); for (image_priority_list_t::iterator iter = mImageList.begin();
...@@ -895,8 +910,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time) ...@@ -895,8 +910,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
imagep->processTextureStats(); imagep->processTextureStats();
F32 decode_priority = imagep->calcDecodePriority(); F32 decode_priority = imagep->calcDecodePriority();
imagep->setDecodePriority(decode_priority); imagep->setDecodePriority(decode_priority);
mImageList.insert(imagep); addImageToList(imagep);
imagep->setInImageList(TRUE) ;
} }
image_list.clear(); image_list.clear();
......
...@@ -83,6 +83,7 @@ class LLViewerTextureList ...@@ -83,6 +83,7 @@ class LLViewerTextureList
void dump(); void dump();
void destroyGL(BOOL save_state = TRUE); void destroyGL(BOOL save_state = TRUE);
void restoreGL(); void restoreGL();
BOOL isInitialized() const {return mInitialized;}
LLViewerFetchedTexture *findImage(const LLUUID &image_id); LLViewerFetchedTexture *findImage(const LLUUID &image_id);
...@@ -120,8 +121,8 @@ class LLViewerTextureList ...@@ -120,8 +121,8 @@ class LLViewerTextureList
void addImage(LLViewerFetchedTexture *image); void addImage(LLViewerFetchedTexture *image);
void deleteImage(LLViewerFetchedTexture *image); void deleteImage(LLViewerFetchedTexture *image);
void addImageToList(LLViewerFetchedTexture *image); void addImageToList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID());
void removeImageFromList(LLViewerFetchedTexture *image); void removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID());
LLViewerFetchedTexture * getImage(const LLUUID &image_id, LLViewerFetchedTexture * getImage(const LLUUID &image_id,
BOOL usemipmap = TRUE, BOOL usemipmap = TRUE,
...@@ -187,6 +188,7 @@ class LLViewerTextureList ...@@ -187,6 +188,7 @@ class LLViewerTextureList
// simply holds on to LLViewerFetchedTexture references to stop them from being purged too soon // simply holds on to LLViewerFetchedTexture references to stop them from being purged too soon
std::set<LLPointer<LLViewerFetchedTexture> > mImagePreloads; std::set<LLPointer<LLViewerFetchedTexture> > mImagePreloads;
BOOL mInitialized ;
BOOL mUpdateStats; BOOL mUpdateStats;
S32 mMaxResidentTexMemInMegaBytes; S32 mMaxResidentTexMemInMegaBytes;
S32 mMaxTotalTextureMemInMegaBytes; S32 mMaxTotalTextureMemInMegaBytes;
...@@ -206,6 +208,9 @@ class LLViewerTextureList ...@@ -206,6 +208,9 @@ class LLViewerTextureList
private: private:
static S32 sNumImages; static S32 sNumImages;
static void (*sUUIDCallback)(void**, const LLUUID &); static void (*sUUIDCallback)(void**, const LLUUID &);
//debug use
static U32 sRenderThreadID;
}; };
class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIImageList> class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIImageList>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment