Texturecache bugs! "cache_size -= entries[idx].mBodySize" must happen before removeEntry in LLTextureCache::purgeTextures, as removeEntry zeros "entries[idx].mBodySize". "mTexturesSizeTotal -= entry.mBodySize"; must happen before "entry.mBodySize = 0" in LLTextureCache::removeEntry because, well, duh.
This commit is contained in:
@@ -1415,22 +1415,21 @@ void LLTextureCache::readHeaderCache()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (num_entries > sCacheMaxEntries)
|
if (num_entries - empty_entries > sCacheMaxEntries)
|
||||||
{
|
{
|
||||||
// Special case: cache size was reduced, need to remove entries
|
// Special case: cache size was reduced, need to remove entries
|
||||||
// Note: After we prune entries, we will call this again and create the LRU
|
// Note: After we prune entries, we will call this again and create the LRU
|
||||||
U32 entries_to_purge = (num_entries - empty_entries) - sCacheMaxEntries;
|
U32 entries_to_purge = (num_entries - empty_entries) - sCacheMaxEntries;
|
||||||
llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl;
|
llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl;
|
||||||
if (entries_to_purge > 0)
|
// We can exit the following loop with the given condition, since if we'd reach the end of the lru set we'd have:
|
||||||
{
|
// purge_list.size() = lru.size() = num_entries - empty_entries = entries_to_purge + sCacheMaxEntries >= entries_to_purge
|
||||||
for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
|
// So, it's certain that iter will never reach lru.end() first.
|
||||||
|
std::set<lru_data_t>::iterator iter = lru.begin();
|
||||||
|
while (purge_list.size() < entries_to_purge)
|
||||||
{
|
{
|
||||||
purge_list.insert(iter->second);
|
purge_list.insert(iter->second);
|
||||||
if (purge_list.size() >= entries_to_purge)
|
++iter;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
llassert_always(purge_list.size() >= entries_to_purge);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1636,9 +1635,9 @@ void LLTextureCache::purgeTextures(bool validate)
|
|||||||
if (purge_entry)
|
if (purge_entry)
|
||||||
{
|
{
|
||||||
purge_count++;
|
purge_count++;
|
||||||
LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL;
|
LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL;
|
||||||
removeEntry(idx, entries[idx], filename) ;
|
|
||||||
cache_size -= entries[idx].mBodySize;
|
cache_size -= entries[idx].mBodySize;
|
||||||
|
removeEntry(idx, entries[idx], filename) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1652,7 +1651,7 @@ void LLTextureCache::purgeTextures(bool validate)
|
|||||||
LL_INFOS("TextureCache") << "TEXTURE CACHE:"
|
LL_INFOS("TextureCache") << "TEXTURE CACHE:"
|
||||||
<< " PURGED: " << purge_count
|
<< " PURGED: " << purge_count
|
||||||
<< " ENTRIES: " << num_entries
|
<< " ENTRIES: " << num_entries
|
||||||
<< " CACHE SIZE: " << mTexturesSizeTotal / 1024*1024 << " MB"
|
<< " CACHE SIZE: " << mTexturesSizeTotal / (1024 * 1024) << " MB"
|
||||||
<< llendl;
|
<< llendl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1875,14 +1874,13 @@ void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename)
|
|||||||
file_maybe_exists = false;
|
file_maybe_exists = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mTexturesSizeTotal -= entry.mBodySize;
|
||||||
|
|
||||||
entry.mImageSize = -1;
|
entry.mImageSize = -1;
|
||||||
entry.mBodySize = 0;
|
entry.mBodySize = 0;
|
||||||
mHeaderIDMap.erase(entry.mID);
|
mHeaderIDMap.erase(entry.mID);
|
||||||
mTexturesSizeMap.erase(entry.mID);
|
mTexturesSizeMap.erase(entry.mID);
|
||||||
|
mFreeList.insert(idx);
|
||||||
mTexturesSizeTotal -= entry.mBodySize;
|
|
||||||
mFreeList.insert(idx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_maybe_exists)
|
if (file_maybe_exists)
|
||||||
|
|||||||
Reference in New Issue
Block a user