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